首頁  >  文章  >  後端開發  >  下载器代码可能有问题,导致PDF文件损坏

下载器代码可能有问题,导致PDF文件损坏

WBOY
WBOY原創
2016-06-23 14:01:051590瀏覽

服务器中的PDF文件是健康的:通过FTP直接下载来验证过。
下载器的部分代码如下:

$file_size = filesize($filedir);
header("Content-type: application/octet-stream;charset=ISO-8859-1");
header("Cache-control: private");
header("Accept-Ranges: bytes");
header("Accept-Length: ".$this->FjSize);
header("Content-Disposition: attachment; filename=" . $this->delFileName);
$fp = fopen($filedir,"r");
$buffer_size = 1024;
$cur_pos = 0;
while(!feof($fp) && $filedir-$cur_pos > $buffer_size)
{
$buffer = fread($fp,$buffer_size);
echo $buffer;
$cur_pos += $buffer_size;
}

if($file_size > 0)
$buffer = fread($fp,$file_size-$cur_pos);
else
$buffer = fread($fp,$this->FjSize);
echo $buffer;
fclose($fp);
flush();


回复讨论(解决方案)

$fp = fopen($filedir,"r b"); //二进制方式打开,虽然 linux 不需要,但仍建议这么做
文本方式打开的文件,0x1a 就视为文件尾了

while(!feof($fp) && $filedir-$cur_pos > $buffer_size)
宜写作
while(!feof($fp))
feof($fp) 就是文件尾了
再 $filedir-$cur_pos > $buffer_size 已无必要
双重判断可能导致失误,比如 $filedir 不是 $buffer_size 整数倍时

另外,除文件内容外,不能输出任何其他内容,包括 BOM 头

按照版主说的改了。照样出错。
PS:程序过去一年都运行良好,最近几天才出问题。

上传了一个文件,内容如下

1234567890
abcdefghijklmnopqrstuvwxyz

然后下载到本地,结果如下

?      2426153钒4噱JLJNIMK先淌紊退/(,*.)-+??   ?? ??&   

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn