php用header()实现文件下载,下载的文件提示被破坏不能打开的解决办法

 
更多

本站以前分享过一个文件下载的函数,具体文章连接地址如下:

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;
}
打赏

本文固定链接: https://www.cxy163.net/archives/3630 | 绝缘体

该日志由 绝缘体.. 于 2015年11月24日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: php用header()实现文件下载,下载的文件提示被破坏不能打开的解决办法 | 绝缘体
关键字: , , , ,

php用header()实现文件下载,下载的文件提示被破坏不能打开的解决办法:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter