我们使用PHP脚本来进行隧道文件下载,因为我们不希望公开可下载文件的绝对路径:
header("Content-Type: $ctype");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=\"$fileName\"");
readfile($file);
Run Code Online (Sandbox Code Playgroud)
不幸的是,我们注意到最终用户无法恢复通过此脚本传递的下载.
有没有办法支持这种基于PHP的解决方案的可恢复下载?
原始问题 我正在从ZF2控制器动作提供mp3文件.这适用于除OS X和iPhone/iPad上的Safari之外的所有浏览器.播放音频,但持续时间仅显示为NaN:NaN,而在每个其他浏览器中显示正确的持续时间.
我在SO上讨论了所有的线程,讨论了同样的问题,似乎它与响应头,特别是Content-Range和Accept-Ranges头有关.我尝试了所有不同的组合,但仍无济于事--Safari仍然拒绝正确显示持续时间.
相关的代码段如下所示:
$path = $teaserAudioPath . DIRECTORY_SEPARATOR . $teaserFile;
$fp = fopen($path, 'r');
$etag = md5(serialize(fstat($fp)));
fclose($fp);
$fsize = filesize($path);
$shortlen = $fsize - 1;
$response->setStatusCode(Response::STATUS_CODE_200);
$response->getHeaders()
->addHeaderLine('Pragma', 'public')
->addHeaderLine('Expires', -1)
->addHeaderLine('Content-Type', 'audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3')
->addHeaderLine('Content-Length', $fsize)
->addHeaderLine('Content-Disposition', 'attachment; filename="teaser.mp3"')
->addHeaderLine('Content-Transfer-Encoding', 'binary')
->addHeaderLine('Content-Range', 'bytes 0-' . $shortlen . '/' . $fsize)
->addHeaderLine('Accept-Ranges', 'bytes')
->addHeaderLine('X-Pad', 'avoid browser bug')
->addHeaderLine('Cache-Control', 'no-cache')
->addHeaderLine('Etag', $etag);
$response->setContent(file_get_contents($path));
return $response;
Run Code Online (Sandbox Code Playgroud)
玩家(我使用的是mediaelementjs)在Safari中看起来像这样:

我也试过根据另一个例子来解释HTTP_RANGE请求头,如下所示:
$fileSize = filesize($path);
$fileTime = date('r', filemtime($path));
$fileHandle = fopen($path, …Run Code Online (Sandbox Code Playgroud) 我的问题非常相似: 我可以用PHP提供MP3文件吗? 基本上我试图保护mp3文件免受直接下载,因此用户必须先通过php才能获得首次验证.这是我的代码:
header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($file));
header('X-Pad: avoid browser bug');
Header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: binary");
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
readfile($file);
Run Code Online (Sandbox Code Playgroud)
这是我的问题:文件只占一开始的一小部分(通过浏览器中的Quicktime)然后停止 - Quicktime似乎认为文件的长度只与它设法下载的块一样长.当我重新加载时 - 它会播放一个稍微大一点的块 - 无论它设法下载到那一点.
这是我发送的标题中的问题吗?我该如何传输这样的文件?如果swf正在从该文件中读取,这是一个问题吗?
谢谢!
谢谢你们所有答案.虽然这些事情都没有解决问题,但很多都让我朝着正确的方向前进.非常感激.有关完整解决方案,请参阅下面的答案