当前位置: 移动技术网 > IT编程>开发语言>PHP > PHP下载大文件

PHP下载大文件

2019年06月01日  | 移动技术网IT编程  | 我要评论

项目中有个700m左右的大文件,需要下载到本地电脑上,在网上找了段代码,如下:

 1 <?php
 2             $realname = "xxx.pdf";
 3             $filename = "xxx.pdf";
 4             set_time_limit(0);
 5             $filesize = filesize($realname);
 6             header('content-description: file transfer');
 7             header('content-type: application/octet-stream');
 8             header('content-transfer-encoding: binary');
 9             header('accept-ranges: bytes');
10             header('expires: 0');
11             header('cache-control: must-revalidate');
12             header('pragma: public');
13             header('content-length: ' . $filesize);
14             header('content-disposition: attachment; filename=' . $filename);
15 
16             // 打开文件
17             $fp = fopen($realname, 'rb');
18             // 设置指针位置
19             fseek($fp, 0);
20 
21             // 开启缓冲区
22             ob_start();
23             // 分段读取文件
24             while (!feof($fp)) {
25                 $chunk_size = 1024 * 8; // 8kb
26                 echo fread($fp, $chunk_size);
27                 ob_flush(); // 刷新php缓冲区到web服务器
28                 flush(); // 刷新web服务器缓冲区到浏览器
29                 sleep(1); // 每1秒 下载 8 kb
30             }
31             // 关闭缓冲区
32             ob_end_clean();
33 
34             fclose($fp);       

完美下载!但是当部署到线上时,出现了问题:

说明:测试环境为http,线上环境为https

继续google....,找到如下代码:

<?php
            $realname = "xxx.pdf";
            $filename = "xxx.pdf";
            set_time_limit(0);
            $filesize = filesize($realname);
            header('content-description: file transfer');
            header('content-type: application/octet-stream');
            header('content-transfer-encoding: binary');
            header('accept-ranges: bytes');
            header('expires: 0');
            header('cache-control: must-revalidate, post-check=0, pre-check=0');
            header('pragma: public');
            header('content-length: ' . $filesize);
            header('content-disposition: attachment; filename=' . $filename);

            // 打开文件
            $fp = fopen($realname, 'rb');
            ob_clean();
            ob_end_flush();
            while (!feof($fp)) {
                echo fread($fp, $filesize);
                ob_flush(); // 刷新php缓冲区到web服务器
                flush(); // 刷新web服务器缓冲区到浏览器
            }

            fclose($fp);
            exit;

完美解决!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网