gpt4 book ai didi

php - Laravel 4.2服务MP3-不可上链

转载 作者:行者123 更新时间:2023-12-03 00:41:49 25 4
gpt4 key购买 nike

我在Laravel 4.2中使用mp3时遇到一些问题
我有一些应该由Flashplayer播放的文件。

    public function get($filename)
{
$file = new Symfony\Component\HttpFoundation\File\File(storage_path().DbConfig::get('system.upload_dir').'/'.DbConfig::get('system.upload_music').'/'.$filename);

$response = Response::make(file_get_contents(storage_path().DbConfig::get('system.upload_dir').'/'.DbConfig::get('system.upload_music').'/'.$filename));
$response->header('Content-Type', $file->getMimeType());
$response->header('Content-Length', $file->getSize());
$response->header('Content-Transfer-Encoding', '');
$response->header('Accept-Range', 'bytes');
$response->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0');
$response->header('Connection', 'Keep-Alive');
return $response;
}

这可以处理文件-如果以chrome打开,则会启动chrome的默认播放器并播放音乐,同样的事情是我将其与Flashplayer放在一起时使用。

但是 我无法结束记录
如果我使用apache(而不是Laravel Controller )提供文件,则可以正常工作。

如果有人可以帮助我解决此问题,我将不胜感激。

更新

通过Laravel提供的标题:
HTTP/1.1 200 OK
Date: Thu, 01 Oct 2015 18:43:59 GMT
Server: Apache/2
Cache-Control: must-revalidate, post-check=0, pre-check=0, private
Content-Transfer-Encoding:
Accept-Range: bytes
Connection: Keep-Alive, Keep-Alive
Set-Cookie: laravel_session=eyJ[...]D; expires=Thu, 01-Oct-2015 20:44:00 GMT; Max-Age=7200; path=/; httponly
Vary: Accept-Encoding,User-Agent
Keep-Alive: timeout=2, max=100
Transfer-Encoding: chunked
Content-Type: audio/mpeg

没有Laravel时提供的 header :
HTTP/1.1 200 OK
Date: Thu, 01 Oct 2015 18:51:16 GMT
Server: Apache/2
Last-Modified: Fri, 13 Mar 2015 04:03:23 GMT
ETag: "ead61-5112394e338c0"
Accept-Ranges: bytes
Content-Length: 961889
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: audio/mpeg

最佳答案

对于我来说, header 的主要区别是使用Laravel时没有Content-Length。我不知道Flash播放器的工作方式,但是我冒险冒险需要知道文件的长度,以便能够找到(即绕)任何位置。

但是,您发布的代码会显式设置该 header 。经过一番搜索,我发现了这个Laravel问题:2079。他们建议使用未记录的Response::stream发送文件内容,如下所示:
Response::stream(function() use($fileContent) {
echo $fileContent;
}, 200, $headers);

这是Symfony doc for StreamedResponse

更新响应类型

您正在提供静态文件,因此要使用的适当响应类型是lart的 BinaryFileResponse Response::download($pathToFile, $name, $headers)

(顺便说一句,您可以使用第三个参数设置标题)

更新内容长度

Symfony's Response 类的源代码拥有删除Content-Length的关键:

/**
* Prepares the Response before it is sent to the client.
*
* This method tweaks the Response to ensure that it is
* compliant with RFC 2616. Most of the changes are based on
* the Request that is "associated" with this Response.
*
* @param Request $request A Request instance
*
* @return Response The current response.
*/
public function prepare(Request $request)
{
$headers = $this->headers;
if ($this->isInformational() || $this->isEmpty()) {
// [snip]
} else {
// [snip]
// Fix Content-Length
if ($headers->has('Transfer-Encoding')) {
$headers->remove('Content-Length');
}
// [snip]
}
// [snip]
}

RFC 2616不允许同时使用 Transfer-EncodingContent-Length header ,Symfony强制执行此操作。引用:

4.4 Message Length

[...]

3.If a Content-Length header field (section 14.13) is present, its decimal value in OCTETs represents both the entity-length and the transfer-length. The Content-Length header field MUST NOT be sent if these two lengths are different (i.e., if a Transfer-Encoding header field is present). If a message is received with both a Transfer-Encoding header field and a Content-Length header field, the latter MUST be ignored.



另外,根据此 SO questionContent-Transfer-Encoding仅在电子邮件中使用。否则使用 Transfer-Encoding

另一件事:您在Laravel中使用了 Accept-Range而不是在Apache中使用了 Accept-Ranges

最后,尝试一个简单的 download响应而不设置任何标题,然后看看您得到了什么。然后根据需要添加更多标题。

关于php - Laravel 4.2服务MP3-不可上链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32806504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com