关于down_file()文件大小的限制
来源:2-11 文件下载函数封装
隔壁班的黄同学
2018-01-15 01:03:51
确切来说应该是fopen或者feof的问题,我下载的测试文件为1.05GB,测试时每次走到660MB左右就结束循环了。我开的是phpstudy的本地服务器,难道是神秘的保护机制吗?第二个问题,下载时,下载内容没有显示文件大小,只有下载大小,请问怎么加上去呢?
下面上代码:
function down_file(string $filename,array $allowDownExt=array('jpeg','jpg','png','gif','txt','html','rar','zip','wmv','avi','mp4','rmvb')){
// 自己的测试代码
echo trans_byte(filesize($filename));
$read_buffer = 1024;
$sum_buffer = 0;
$handle=fopen($filename,'rb');
while (!feof($handle)&&$sum_buffer<filesize($filename)){
echo trans_byte($sum_buffer).'<br/>';
$sum_buffer+=$read_buffer;
}
fclose($handle);
// 下面是老师的代码,为了不发送请求头信息,让下面的判断直接return false
// 检测是否是文件
if(is_file($filename)||!is_writable($filename)){
return false;
}
// 检测文件类型是否允许下载
$ext = strtolower(pathinfo($filename,PATHINFO_EXTENSION));
if(!in_array($ext,$allowDownExt)){
return false;
}
// 通过header()发送请求头信息,告诉浏览器输出的是字节流
header('Content-Type:application/octet-stream');
// 告诉浏览器返回的文件大小是按照字节进行计算的
header('Accept-Ranges:bytes');
$filesize=filesize($filename);
// 告诉浏览器返回的文件大小
header('Accept-Length'.$filesize);
// 告诉浏览器文件作为附件处理,告诉浏览器最终下载完的文件名称
header('Content-Disposition:attachment;filename=ziyang_'.basename($filename));
// 规定每次读取文件的字节数为
$read_buffer = 1024;
$sum_buffer = 0;
echo trans_byte($filesize);
$handle=fopen($filename,'rb');
while (!feof($handle)&&$sum_buffer<$filesize){
echo fread($handle,$read_buffer);
$sum_buffer+=$read_buffer;
}
fclose($handle);
exit;
}2回答
imooc_澈
2018-01-15
您好,文件名为中文名会出现文件不存在,可以使用$file_name = iconv("utf-8","gbk//IGNORE",$file_name);进行编码转换,经小慕测试,老师的源码下载1G以上的大文件是没有问题的哦,也是phpstudy,循环打印只到660M问题可能出现在浏览器的显示上,同学不用太纠结,循环读取成功才能正常下载,如图:localhost/test.php

小慕不太懂您的显示文件大小,要知道文件大小,像您给出的代码中一样使用ttrans_byte函数打印出来看一下就可以知道,我们平时再网页中下载资源之前能看到文件大小也是因为后端代码执行相应的方法获取到文件大小,然后展示在前台了,而这里我们是直接php下载功能代码,没有进行展示。所以你并没有看到文件的大小。
如果解决了您的问题,请采纳,祝学习愉快~
隔壁班的黄同学
提问者
2018-01-15
另外,如果文件名是中文的话,is_file($filename)也会return false,请问怎么解决呢?还有,下载的文件大小是正确的,有些文件会出现下载之后打不开的BUG
相似问题