用php脚本下载大型mkv文件

时间:2012-03-06 20:27:41

标签: php download mkv

在使用下面的代码进行一些测试后,我得出了这样的结论:

  • 该脚本适用于firefox和chrome中的AVI文件(如果我将内容类型更改为视频/ avi)
  • 该脚本适用于Chrome中的MKV文件。 Firefox虽然在我脸上抛出了一条错误信息(见下文)
  • 我从http://matroska.org/downloads/test_w1.html下载了一个20 MB的大测试文件(test7.mkv),用较小的文件进行测试。奇怪的是Firefox可以下载该文件,它似乎有效。但是,如果我在一个6 GB的大文件上尝试它,我会看到你在下面看到的firefox错误
  • 编辑:下载一个700 MB的文件,在SM播放器(exitcode 1)中完全没有播放,但在VLC播放器中播放得很好。我目前正在寻找一种方法来查找文件可能损坏的方式和位置。

我明显的问题是:我做错了什么?如何在firefox或更好的任何常见浏览器中正确下载mkv文件。我在谷歌上找不到任何有用的东西,但也许我只是在找错了地方。

尝试下载mkv文件时出现Firefox错误:

  

损坏的内容错误

     

您尝试查看的页面无法显示,因为检测到数据传输错误。

     

您尝试查看的页面无法显示,因为检测到数据传输错误。请联系网站   业主告诉他们这个问题。

    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;
    }
}

2 个答案:

答案 0 :(得分:0)

  

服务器上mkv文件的绝对路径

Firefox可能会在filename标头值的绝对路径上窒息。

请尝试仅指定文件名:

 $filename = pathinfo($filePath, PATHINFO_BASENAME);
 header("Content-Disposition: attachment; filename=\"$filename\"");

答案 1 :(得分:0)

解决方案:

我应该检查我定义的变量是否设置为预期值。变成filesize()返回一个带有32位的signed int。

现在我刚刚接受了这里显示的功能:https://stackoverflow.com/a/5502328/1232791

另一种可能的解决方案是不定义内容长度标头。有了这个解决方案,客户端就不会知道他的下载需要多长时间。

相关问题