2012-06-02 38 views
0

我試圖用php下載一些文件來隱藏文件路徑,但是一些文件類型總是被破壞。 像PDF和MP3文件類型很好。 像doc,ppt,jpg等文件類型總是下載破碎。用php下載jpg,doc,ppt文件已損壞

我使用這些MIME類型

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); 
     } 
+0

你正在下載PPT/DOC或PPTX/DOCX? DocX內容類型是「application/vnd.openxmlformats-officedocument.wordprocessingml.document」,PPTX是「application/vnd.openxmlformats-officedocument.presentationml.presentation」 – AvkashChauhan

+0

你打開和輸出文件的方式是什麼? – user2428118

+0

使用word2003創建的Doc文件和使用powerpoint2003的powerpoint文件。 –

回答

1

我的猜測是,你在你的PHP代碼輸出空白字符。可能是換行。當通過PHP提供二進制文件時,這是造成文件損壞的一個常見原因,並且很難發現。在一些文件類型被損壞而另一些文件類型不被破壞的情況下也是非常典型的,因爲一些文件類型可以應付額外的空白。

只需在<?php?>標記以外的源代碼中提供換行符,就可以非常方便地將白色空間嵌入到PHP程序中。

檢查您的PHP程序 - 以及您的所有包含 - 以確保在程序結束時關閉?>後沒有任何尾隨空行。還請在<?php標記之前檢查文件的頂部,但程序結尾的空白行更常見。

事實上,最好完全刪除?>結束標記 - 無論如何它是可選的,並且刪除它意味着您絕對不會在PHP文件末尾有任何空白問題。

希望有所幫助。

+0

經過測試。刪除?>凱清除空白,但仍然是同樣的問題。 –

+0

您是否對原始文件與下載的副本進行了字節比較?這可能會給你一個線索,知道它是什麼。 – Spudley

+0

下載的文檔文件有66.051字節和原始的66.045字節 –