【发布时间】:2011-06-13 09:37:07
【问题描述】:
我有一个强制下载脚本,它可以在 PDF 和纯文本中产生良好的效果,并且可以使用 ZIP 存档(它们在 Windows 中工作,而不是在 Linux 中工作)。但是,应用程序文件和图像都失败了。这些构成了我必须处理的绝大多数文件。正如我在这里看到的类似主题所建议的那样,压缩所有下载不是一种选择。
失败的文件下载到完整大小,并以正确的名称写入磁盘。尝试打开它们会导致错误消息,该消息因类型而异。在 hexdump 中比较下载的文件和它们的原始文件,我可以看到脚本在每个下载文件的开头插入以下字符:
ef bb bf
然后,下载的文件会复制原始文件,直到它停止在指定大小处 - 因此原始文件的最后 6 个字符总是丢失。
不幸的是,我对二进制文件是如何构成的、这些字符可能意味着什么以及脚本如何/为什么插入它们一无所知。
这是原样的脚本:
$file = '94.ppt';
$path = $_SERVER['DOCUMENT_ROOT']."/relative/path/";
$full_path = $path.$file;
if ($fd = fopen ($full_path, "r")) {
$fsize = filesize($full_path);
$path_parts = pathinfo($full_path);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "txt":
header("Content-type: text/plain");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "jpg":
header("Content-type: image/jpeg");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "ppt":
header("Content-Type: application/vnd.ms-powerpoint");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
}
header("Content-Transfer-Encoding: binary");
header("Content-length: $fsize");
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
开发系统是 Apache 2.2.14 (Ubuntu) 上的 PHP 5.3.2-1。生产主机是 Apache 2.0.63(某种 Linux)上的 PHP 5.2.9。
【问题讨论】:
-
不确定这是您帖子中的错字还是实际代码“默认”;应该是:不是;