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!”
问题就解决了!感兴趣的小伙伴可以自己深入探究我就不啰嗦啦哈哈哈。也希望大家能指出我的不足,分享自己的解决方法。
“如果真诚地试着帮助他人,必然也同时帮助了自己。”——鲁迅