在使用以下代码进行了一些测试后,我得出了以下结论:
- 该脚本适用于firefox和chrome中的AVI文件(当然,如果我将内容类型更改为video/AVI)
- 该脚本适用于Chrome中的MKV文件。Firefox在我脸上弹出了一条错误消息(见下文)
- 我从下载了一个20 mb的大测试文件(test7.mkv)http://matroska.org/downloads/test_w1.html以使用较小的文件进行测试。奇怪的是,Firefox可以下载该文件,而且它似乎可以工作。然而,如果我在一个6 gb的大文件上尝试它,我会得到下面的firefox错误
- 编辑:下载了一个700 mb的文件,在SM播放器中根本没有播放(exitcode 1),但在VLC播放器中播放得很好。我目前正在寻找一种方法来查找文件可能被损坏的方式和位置
我显而易见的问题是:我做错了什么?如何在firefox中正确下载mkv文件,或者在任何普通浏览器中下载更好的mkv文件。我在谷歌上找不到任何有用的东西,但也许我只是找错地方了。
Firefox尝试下载mkv文件时出错:
损坏的内容错误
由于检测到数据传输错误,无法显示您尝试查看的页面。
由于检测到数据传输错误,无法显示您尝试查看的页面。请联系网站业主告知他们这个问题。
function download($file)
{
$path = $_SERVER['DOCUMENT_ROOT']; //<-- added the relative part after that
$fullPath = $path.$file;
set_time_limit(0);
if ($fd = fopen ($fullPath, "r"))
{
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: video/x-matroska");
header("Content-Disposition: attachment; filename='"$file'"");
header("Content-Transfer-Encoding: binary");
header("Content-length: $fsize");
$file = @fopen($fullPath,"rb");
if ($file)
{
while(!feof($file))
{
print(fread($file, 1024*8));
flush();
if (connection_status()!=0)
{
@fclose($file);
die();
}
}
@fclose($file);
}
exit;
}
}
服务器上mkv文件的绝对路径
Firefox可能会被filename
标头值中的绝对路径阻塞。
试着只指定一个文件名:
$filename = pathinfo($filePath, PATHINFO_BASENAME);
header("Content-Disposition: attachment; filename='"$filename'"");
解决方案:
我应该检查我定义的变量是否设置为预期值。结果是filesize()返回一个32位的带符号int。
现在,我只取了这里显示的函数:https://stackoverflow.com/a/5502328/1232791
另一种可能的解决方案是不定义内容长度标头。有了这个解决方案,客户端不会知道他的下载需要多长时间。