本站以前分享过一个文件下载的函数,具体文章连接地址如下:
PHP文件下载函数(代码)
最近一客户反映他们网站上所有的图片下载不了了,下载下来的图片都提示文件被破坏,直接导致打不开,作者测试了下发现确实有这个问题,仔细看了下源代码,发现问题的根源在fread这个函数,fread函数的第二个参数是设置读取最大的字节数,经试验发现fread函数单次最大能够读取的字节数是有限制的,仅为8192个字节,即8KB,对于超过这个大小的文件,如果要完整读取,则需要循环读取直至文件结尾。综合以上做了些改正,以下代码是休整之后的代码,经测试问题解决。
//$file 被下载文件的地址 function download($file){ if(!$file||!is_file($file||!file_exists($file))){ echo '404'; exit; } header('Content-Type:application/octet-stream'); $fileName=basename($file); header('Content-Disposition:attachment;filename="'.$fileName.'"'); $buffer=''; $cnt=0; $handle=fopen($file,'rb'); if($handle===false){ return false; } while(!feof($handle)){ $buffer=fread($handle,1024*1024); echo $buffer; ob_flush(); flush(); if($retbytes){ $cnt+=strlen($buffer); } } $status=fclose($handle); if($retbytes&&$status){ return $cnt; } return $status; }