当前位置:  开发笔记 > 编程语言 > 正文

在PHP中可靠地下载大文件

如何解决《在PHP中可靠地下载大文件》经验,为你挑选了3个好方法。

我在服务器上有一个PHP脚本将文件发送给配方:它们获得一个唯一的链接,然后他们可以下载大文件.有时传输出现问题,文件已损坏或永不完成.我想知道是否有更好的方法来发送大文件

码:

$f = fopen(DOWNLOAD_DIR.$database[$_REQUEST['fid']]['filePath'], 'r');
while(!feof($f)){
    print fgets($f, 1024);
}
fclose($f);

我见过的功能如

http_send_file
http_send_data

但我不确定他们是否会奏效.

解决这个问题的最佳方法是什么?

问候
erwing



1> garrow..:

如果您要发送真正大的文件并担心它会产生的影响,您可以使用x-sendfile头.

从SOQ 使用-xsendfile-with-apache-php,一个howto blog.adaniels.nl:how-i-php-x-sendfile /


这里有一个["**大文件下载**"PHP脚本](http://phpsnips.com/579/PHP-download-script-for-Large-File-Downloads)可处理大约**2GB**许多文件类型,如exe,mp3,mp4,pdf等.这个脚本值得通过PHP脚本下载中小文件大小.它还描述了**X-sendfile**,用于超过5GB的真正大量文件下载.看看链接.

2> 小智..:

最好的解决方案是依赖lighty或apache,但如果在PHP中,我会使用PEAR的HTTP_Download(不需要重新发明轮子等),有一些不错的功能,如:

基本限制机制

范围(部分下载和恢复)

请参阅介绍/使用文档.



3> trejder..:

文件分块是PHP最快/最简单的方法,如果你不能或不想使用一些更专业的像卷曲,mod-xsendfile在阿帕奇或一些专门的脚本.

$filename = $filePath.$filename;

$chunksize = 5 * (1024 * 1024); //5 MB (= 5 242 880 bytes) per one chunk of file.

if(file_exists($filename))
{
    set_time_limit(300);

    $size = intval(sprintf("%u", filesize($filename)));

    header('Content-Type: application/octet-stream');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: '.$size);
    header('Content-Disposition: attachment;filename="'.basename($filename).'"');

    if($size > $chunksize)
    { 
        $handle = fopen($filename, 'rb'); 

        while (!feof($handle))
        { 
          print(@fread($handle, $chunksize));

          ob_flush();
          flush();
        } 

        fclose($handle); 
    }
    else readfile($path);

    exit;
}
else echo 'File "'.$filename.'" does not exist!';

来自richnetapps.com/NeedBee.在200 MB文件上进行测试readfile(),即使设置了最大允许内存限制,也会死亡,这1G比下载文件大小多五倍.

顺便说一句:我也在文件上对此进行了测试>2GB,但PHP只设法先写入2GB文件,然后断开连接.与文件相关的函数(fopen,fread,fseek)使用INT,因此你最终达到了极限2GB.mod-xsendfile在这种情况下,上述解决方案(即)似乎是唯一的选择.

编辑:让自己100% ,你的文件保存在utf-8.如果省略,则下载的文件将被破坏.这是因为此解决方案用于print将文件块推送到浏览器.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有