欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP下载大文件

程序员文章站 2022-07-10 23:35:06
项目中有个700M左右的大文件,需要下载到本地电脑上,在网上找了段代码,如下: 完美下载!但是当部署到线上时,出现了问题: 说明:测试环境为http,线上环境为https 继续google....,找到如下代码: 完美解决! ......

项目中有个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

PHP下载大文件

继续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;

完美解决!