PHP下载文件函数封装及下载大文件解决方案
PHP下载文件函数封装及下载大文件解决方案
大家好,我是Yangrl.
今天分享的是我在学习PHP文件操作部分中实现一个下载文件函数封装时遇到的问题(小文件没问题,大文件总是下载失败)和解决的过程。
进入正题:
先贴出OJBK代码段
function down_file($filename,$allowDownExt=array ("jpg","jpeg","gif", "rar","zip","png","txt","html")) {
//检测文件是否存在,并且可读
if(!is_file($filename) && is_readable($filename)) {
return false;
}
//获取文件的扩展名
$fileext=strtolower(pathinfo($filename,PATHINFO_EXTENSION));
//检测文件类型是否允许下载
if(!in_array($fileext,$allowDownExt)) {
return false;
}
//设置脚本的最大执行时间,设置为0则无时间限制
set_time_limit(0);
//通过header()发送头信息
//因为不知道文件是什么类型的,告诉浏览器输出的是字节流
header("content-type:application/octet-stream");
//告诉浏览器返回的文件大小类型是字节
header("Accept-Ranges:bytes");
//获得文件大小
$filesize=filesize($filename);
//告诉浏览器返回的文件大小
header("Accept-Length:".$filesize);
//告诉浏览器文件作为附件处理并且设定最终下载完成的文件名称
header("content-disposition:attachment;filename=yangrl".basename($filename));
//针对大文件,规定每次读取文件的字节数为4096字节,直接输出数据
$read_buffer=4096;
$handle=fopen($filename, "rb");
//总的缓冲的字节数
$sum_buffer=0;
//只要没到文件尾,就一直读取
while(!feof($handle) && $sum_buffer<$filesize) {
echo fread($handle,$read_buffer);
$sum_buffer+=$read_buffer;
}
//关闭句柄
fclose($handle);
exit;
}
**2.rar为一个18.8MB大小的压缩文件,2_1.rar为一个1.70 GB大小的压缩文件(之前还有个1.rar,是一个几百KB的压缩文件,就不展示了,和2.rar大小一个级别的都能成功下载)
运行后测试,首先下载2.rar,下载成功保持在了浏览器下载目录里
然后继续测试下载2_1.rar,问题出现:
我连续下载了5次,但没有一次是成功下载,或多或少都没下载完整,那啷个办耶?
好吧,一顿百度过后,各路大神都有自己的一套,可一一尝试对我的这段代码都没用啊,最后谷歌到了一行代码 “set_time_limit(0);”:设置脚本最大执行时间,设置为0则无限制,然后。。“山猫山猫,我是海鸥,连下两次成功,over!”
问题就解决了!感兴趣的小伙伴可以自己深入探究我就不啰嗦啦哈哈哈。也希望大家能指出我的不足,分享自己的解决方法。
“如果真诚地试着帮助他人,必然也同时帮助了自己。”——鲁迅
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: PHP处理大文件下载
- 下一篇: PHP超大文件下载,断点续传下载