我正在尝试使用 php 下载一些文件以隐藏文件路径,但某些文件类型总是损坏。像pdf和mp3这样的文件类型效果很好。像doc,ppt,jpg这样的文件类型总是下载损坏。
我使用这些哑剧类型
if (file_exists($file_real)){
$extension = strtolower(substr(strrchr($file, "."), 1));
switch($extension){
case "ppt": $type = "application/vnd.ms-powerpoint"; break;
case "pdf": $type = "application/pdf"; break; //------ok
case "doc": $type = "application/msword"; break;
case "mp3": $type = "audio/mpeg"; break;//------ok
case "jpg": $type = "image/jpg"; break;
default: $type = "application/force-download"; break;
}
和这些标头
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public", false);
header("Content-Description: File Transfer");
header("Content-Type: " . $type);
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename='"" . $header_file . "'";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file_real));
if ($stream = fopen($file_real, 'rb')){
while(!feof($stream) && connection_status() == 0){
set_time_limit(0);
print(fread($stream,1024*8));
flush();
}
fclose($stream);
}
我的猜测是你在PHP代码中输出空格字符。可能是换行符。这是通过 PHP 提供二进制文件时文件损坏的非常常见的原因,并且可能很难发现。在某些文件类型已损坏而其他文件类型未损坏的情况下,这也是非常典型的情况,因为某些文件类型可以处理额外的空格。
空格很容易渗透到 PHP 程序中,只需在源代码中将换行符放在<?php
和?>
标记之外即可。
检查您的 PHP 程序 - 以及您的所有包含 - 以确保它们在程序末尾的关闭?>
之后没有任何尾随空白行。还要检查文件顶部的<?php
标记之前,但程序末尾的空白行更为常见。
事实上,最好完全删除?>
结束标记 - 无论如何它都是可选的,删除它意味着你在PHP文件的末尾绝对不会有任何空格问题。
希望有帮助。