使用 php 脚本下载大型 mkv 文件

Posted

技术标签:

【中文标题】使用 php 脚本下载大型 mkv 文件【英文标题】:download large mkv files with php script 【发布时间】:2012-03-06 20:27:40 【问题描述】:

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

该脚本适用于 firefox 和 chrome 中的 AVI 文件(当然,如果我将内容类型更改为 video/avi) 该脚本适用于 Chrome 中的 MKV 文件。 Firefox 在我面前抛出了一条错误消息(见下文) 我已经从http://matroska.org/downloads/test_w1.html 下载了一个 20 mb 的大测试文件 (test7.mkv) 以使用较小的文件进行测试。奇怪的是 Firefox 可以下载该文件并且它似乎可以工作。但是,如果我在 6 GB 的大文件上尝试它,我会收到您在下面看到的 firefox 错误 编辑:下载了一个 700 mb 的文件,在 SM 播放器(退出代码 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;
    

【问题讨论】:

查看损坏文件的源代码。您可能会在其中找到一条 php 错误消息。 哪个文件,不设置这样的标题只是提示用户在$filePath 下载文件?浏览器告诉我文件已损坏。我没有收到任何 php 消息。 下载的文件。看看里面。 $filePath 包含什么? “您可能会在其中找到 PHP 错误消息” - Firefox 甚至没有做到这一点,他只是给出了我在上面发布的错误消息。所以没有从那里进行故障排除。 【参考方案1】:

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

Firefox 可能会在 filename 标头值中的绝对路径上阻塞。

尝试只指定一个文件名:

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

【讨论】:

【参考方案2】:

解决方案:

我应该检查我定义的变量是否设置为预期值。原来 filesize() 返回一个 32 位的有符号整数。

现在我只使用这里显示的函数:https://***.com/a/5502328/1232791

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

【讨论】:

以上是关于使用 php 脚本下载大型 mkv 文件的主要内容,如果未能解决你的问题,请参考以下文章

Java从零到企业级电商项目实战

为啥油管mkv格式无法下载

sh Bash脚本批量转换.MKV文件到.MP4与avconv

使用 PHP 下载脚本发送正确的文件大小

如何启动使用jQuery自动下载zip文件的PHP脚本

使用 PHP 将大型 KML 文件拆分为较小的文件