2012-07-16 88 views
0

我正在製作一個網站,用戶可以上傳,閱讀和下載PDF文件。上傳工作正常,他們可以在線閱讀pdf文件,也可以使用adobe reader插件下載。但是我寫的下載代碼讓我很難過。它下載文件,但文件不在Adobe Reader中打開。它提供了一個錯誤「Adobe Reader無法打開文件,因爲它不是受支持的文件類型或文件已被損壞」。我遇到了麻煩,我的php下載代碼

這裏是我的代碼:

if(is_file($fullPath)) { 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts['extension']); 
    switch($ext) { 
    case 'pdf': 
     header('Content-type: application/pdf'); 
     header('Content-Disposition: attachment; filename="' . $fullPath. '"'); 
     break; 
    default: 
     header('Content-type: application/octet-stream'); 
    } 
    header('Content-length: $fsize'); 
    header('Cache-control: private'); //use this to open files directly 
    readfile($name); 
} 
exit; 

能有人幫助我嗎?

+0

有人可以幫我解決這個問題。自從幾天以來,我有斌試圖解決這個問題。 – 2012-07-16 11:17:34

+0

如果給出'$ name'和'$ fullPath'的內容示例,可能會更容易提供幫助。看起來,我會說你應該在Content-Disposition頭文件中使用'$ name',在'readfile()' – Flygenring 2012-07-16 17:15:21

回答

1

echo "<br>$fullPath<br>";

此,擺脫了這一點。

1

不要echo之前header內容發送。

只是將其刪除

echo "<br>$fullPath<br>"; 
0

正如有人說,頭在,如果沒有指定時第一輸出發送,因此您的迴音會觸發腳本發送的標準頭的內容類型,如Web服務器指定的 - 可能是HTML或類似的東西。

而且你有其他不必要的東西在你的代碼,所以我建議是這樣的:

if(is_file($fullPath)) { 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts['extension']); 
    switch($ext) { 
    case 'pdf': 
     header('Content-type: application/pdf'); 
     header('Content-Disposition: attachment; filename="' . $name . '"'); 
     break; 
    default: 
     header('Content-type: application/octet-stream'); 
     header('Content-length: ' . filesize($fullPath)); 
     header('Cache-control: private'); //use this to open files directly 
    } 
    readfile($fullPath); 
} 
exit; 

最大的區別是,最初的檢查只檢查文件是否存在,並沒有打開文件。輸出是通過打開文件並將其直接寫入輸出緩衝區來完成的。 我從默認情況下刪除了部分Content-Disposition標頭,因爲默認情況下它會執行相同或更好的操作,並且將Content-lenght和Cache-control移至默認情況,因爲它們不需要用於pdf下載。 此外,我將其更改爲提供文件名爲$name的文件。如果$name在給定範圍之外定義,我懷疑它應該是另一種方式。

如果腳本失敗,您可能只是錯誤的路徑到PDF文件。試試把這個代碼放在上面的那個之前

echo 'The file "' . $fullPath . '" ' . (is_file($fullPath) ? 'exists' : 'doesn\'t exist'); 
+0

中使用'$ fullPath',但是我仍然得到相同的錯誤。 $ name是從數據庫中提取的,並在下載時給出文件的名稱,$ fullpath是文件的路徑,所以我不希望它是下載時文件的名稱。 – 2012-07-16 08:10:44

+0

錯誤也告訴「文件可能沒有被正確解碼」。 – 2012-07-16 08:11:51

+0

我剛剛更新了我的答案,使用[PHP頭文檔中的第一個示例](http://php.net/manual/en/function.header.php#example-4117) – Flygenring 2012-07-16 09:02:30

相關問題