我有一個使用PDF和純文本產生良好結果的強制下載腳本,並且使用ZIP歸檔(它們在Windows中工作,而不是在Linux中)是半正常的。但是,應用程序文件和圖像都失敗。這些構成了我必須處理的絕大多數文件。如我在這裏看到的類似主題中所建議的那樣,壓縮所有下載並不是一種選擇。我該如何解決這個PHP下載腳本,它正在破壞文件?
失敗的文件下載到它們的完整大小,並以正確的名稱寫入磁盤。嘗試打開它們會導致錯誤消息,這在類型之間會有所不同。在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;
開發系統是PHP 5.3.2-1在Apache 2.2.14(Ubuntu的)。生產主機在Apache 2.0.63(某種類型的Linux)上是PHP 5.2.9。
不確定它是否是您的文章中的錯字或實際代碼「default」應該是:不是; – bumperbox 2011-06-13 09:47:06