$filename = $_GET['filename'];
$file_path = 'c:/test.exe';
// $file_size = filesize($file_path); // filesize()使用整型计算大小,导致文件超出2G后会失败,具体参看官方手册
$out_file_size = stat($file_path)['size']; // 使用获取文件信息的方法,获得文件大小
$file = fopen($file_path, "r");
// ob_clean — 清空(擦掉)输出缓冲区
ob_clean();//返回的文件(流形式)[类型相关参考连接](https://blog.csdn.net/lizeyang/article/details/8982155)
header("Content-type: application/octet-stream");
// 服务器回应格式 Content-Range: bytes first-end/total
header("Content-Range:0-" . ($out_file_size-1) . "/$out_file_size");
// 返回文件大小(用于浏览器计算剩余下载时间,需要Content-Range属性才能生效)
header("Content-Length:" . $out_file_size);
//这里客户端的弹出对话框,对应的文件名
header("Content-Disposition: attachment; filename=".$filename);//设置分流读取大小
$buffer=1024;
//文件字节计数器
$count=0;
// feof() 函数检测是否已到达文件末尾 (eof)。
while(!feof($file)&&($out_file_size-$count>0)){$data = fread($file,$buffer);//计数$count += strlen($data);//传数据给浏览器端echo $data;ob_flush(); // 输出ob缓存(防止占用内存过大)flush(); // 尝试输出到浏览器(防止占用内存过大)
}
// 可简单的echo fread($file, $file_size);一次性输出,但要注意文件大小。
fclose($file);

进阶版:添加限速

$out_file_path = '要下载的超大文件路径';$rate_limiting_second = 8 * 1024 * 1024; // 限速:单位为B/s,<=0则取消限速$out_file_size = stat($out_file_path)['size']; // 获取文件大小
header("Content-Length:" . $out_file_size);
header("Content-Range:0-" . ($out_file_size-1) . "/$out_file_size");
header("Content-Disposition: attachment; filename=" . basename($out_file_path));
$out_file = fopen($out_file_path, "r");
$buffer = 1024;
$count = 0;
$start_count = 0; // 单次限制起始数量
$start_time = get_microtime(); // 单次限制起始时间
while (!feof($out_file) && ($out_file_size - $count > 0)) {$data = fread($out_file, $buffer);$count += strlen($data);echo $data;ob_flush();flush();if ($rate_limiting_second > 0) { // 是否开启限速$now_time = get_microtime(); // 获取当前时间$this_interval_time = $now_time - $start_time; // 当前单次限制总发送时间$this_interval_count = $count - $start_count; // 当前单次限制总发送数量if ($this_interval_count >= $rate_limiting_second) { // 达到单次限制量,开始计算并限制网速if ($this_interval_time < 1) { // 时间小于1秒,则睡眠$sleep_time = 1 - $this_interval_time; // 计算睡眠总时间$sleep_nanosecond = round(($sleep_time - floor($sleep_time)) * 1000 * 1000 * 1000); // 计算睡眠纳秒时间time_nanosleep(floor($sleep_time), $sleep_nanosecond); // 睡眠}$start_time = get_microtime(); // 更新下次限制起始时间$start_count = $count; // 更新下次限制起始数量}}
}
fclose($out_file);
if (!function_exists('get_microtime')) {function get_microtime() {$time_str = microtime();$array = explode(' ', $time_str);$microtime = $array[0] + substr($array[1], -4);return $microtime;}
}

相关参考:
PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
PHP下载大文件失败怎么办?
PHP Content-Length 标头不起作用
http请求中的range和Content-Range
get_headers — 取得服务器响应一个 HTTP 请求所发送的所有标头

PHP 文件流格式下载文件相关推荐

  1. react接收后端文件_React获取Java后台文件流并下载Excel文件流程解析

    记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(Htt ...

  2. 普通文件下载 + 前端获取后端返回的文件流并下载

    参考资料 前端接受后端文件流并下载的几种方法 ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践 ajax请求二进制流进行处理(ajax异步下载文件) ...

  3. element一次上传多个文件,并将文件名展示出来;使用文件流进行下载

    1.文件批量上传 <el-form-item label="项目资料:" prop="attachmentVos"><!-- 上传的文件进行回 ...

  4. js下载文件流,提示文件损坏问题

    记录一下前端下载后端返回的文件流,提示文件损坏问题. const blob = new Blob([content.data], {// type是需要对应的文件类型type:"applic ...

  5. 根据一个含有服务器文件夹地址下载文件夹下的所有文件(其实需要知道所有文件名)

    项目需要根据一个URL里含有的服务器文件夹地址来下载所有文件夹下的所有文件,我暂时无法根据文件夹路径来获取文件名,报null空指针异常,所以需要在URL里含有所有文件名,或者服务器端写一个根据这个UR ...

  6. Java之文件流操作的文件读写

    Java之文件流操作的文件读写 本人非常喜欢Java的代码风格,今天记录一下文件字符串的读写,但是Java对于 制作exe文件非常不友好,而本人业务的要求,基本上都是制作exe文件,或者程序,Java ...

  7. 将文件流(InputStream)写入文件 将上传文件MultipartFile写到文件

    将文件流(InputStream)写入文件 方式一:不包裹Buffered(不使用缓冲) //将文件流(InputStream)写入文件 long size = 0; FileOutputStream ...

  8. 上传文件正常,下载文件查看失败,下载文件大小为0kb

    上传文件正常,下载文件查看失败,下载文件大小为0kb 首先查看前台传进来的文件名与目录下的文件名是否一致,其次查看下载文件路径是否正确. 我的多出来个日期文件夹 is = new FileInputS ...

  9. Python利用Requests获取2TB大容量不限速小麦魔方网盘/小麦云盘(Own-Cloud.Cn)的文件直链并下载文件

    我们在浏览网页的时候一般都会看到很多好用的网盘,最近很多网盘都是一些开发者比较喜欢使用的,原因大多都是他们不像某盘一样限速,要求充会员而且还要广告.这些大容量的网盘大多也是开源的,所以我们也不能存储一 ...

最新文章

  1. wamp环境下安装imagick扩展
  2. linux(armv7/8)下gdb的安装及查看方法
  3. 钢铁侠“变身”AI布道师?小罗伯特·唐尼这次推出一部AI科普纪录片
  4. php 长短字符串转换,将php的数组按照字符串长短进行排序
  5. 2017-7-6日记
  6. 【人脸表情识别】情绪识别相关会议、比赛汇总(2018-2020)
  7. 根据当前日期算前一年、前一月、前一天(java基础)
  8. 2012,新的一年,新的开始
  9. 华为全新折叠屏方案曝光:让人眼前一亮!
  10. 和机器学习和计算机视觉相关的数学(转载)
  11. 1.4-shell中特殊符号
  12. sap新手学习第一天
  13. 信息化分析:集团企业信息化规划和实施研究
  14. [渝粤教育] 中国地质大学 建筑艺术赏析 复习题
  15. spyder中安装第三方库的包
  16. 微信小程序API----授权登录拿到用户头像昵称等信息
  17. 区块链开发者观点:来自 Carbon 的 Nick Pai
  18. 培训班出身的前端,出路在哪儿?
  19. android pcm频谱_Android音频开发(7):音乐可视化-FFT频谱图
  20. 什么叫“全力以赴”?

热门文章

  1. VMware虚拟机基于CentOS镜像下安装Linux系统教程
  2. 神秘海域4:盗贼末路特效解密
  3. 2022年年度总结 春华秋实 把握所愿
  4. 程序员必须掌握的职场黑话,你知道几个?
  5. 科普“智能导航”--整理自大疆工程师
  6. BZOJ 3884: 上帝与集合的正确用法 欧拉降幂
  7. 西门子精智触摸屏输入输出IO域为什么没有上下限制值提示?
  8. java计算机毕业设计山西农谷企业产品推广展网源码+系统+数据库+lw文档+mybatis+运行部署
  9. 【2023计算机考研】211院校录取分数线汇总
  10. 拼多多的农研大赛,正在撬动下一个未来市场