2009-12-23 73 views
1

我使用下面的代碼來下載一個PDF ....PDF下載不正常

header('Content-Type: application/pdf'); 
    header('Content-Disposition: attachment; filename="NewName.pdf"'); 
    readfile($root_path.'/full-tile-book.pdf'); 

這是一個13 MB的文件,只有下載130K一樣,當然不能被打開。我如何調試問題在這裏?我的pdf路徑是正確的。

+1

在記事本中打開結果,也許你會發現一個php錯誤到底 – 2009-12-23 20:11:17

回答

1

也許你正在運行到內存/文件大小錯誤?我在過去使用readfile轉儲大文件時遇到了問題。除了設置Content-Length頭部之外,我建議使用fpassthru(),因爲它不會將文件讀入緩衝區,它只是將其轉儲。

set_time_limit(0); // disable timeout 
$file = $root_path.'/full-tile-book.pdf'; 
header('Content-Type: application/pdf'); 
header('Content-Disposition: attachment; filename="NewName.pdf"'); 
header('Content-Length: ' . filesize($file)); 
session_write_close(); // remove this line if sessions are not active 
$f = fopen($file, 'rb'); 
fpassthru($f); 
fclose($f); 
exit; 

編輯:如果您使用的任何sessions_code,這是一個好主意,開始文件轉儲過程之前結束會話。我已更新我的示例以反映此情況。

0

我想添加一些項目。指定文件名以$文件,然後嘗試:

header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 

這將確保客戶期待的正確長度,並很好地之間的輸出緩衝區刷新。

0

看到下載的文件也許在PHP中有不好的地址使用。
你可以按照這個教程在PHP中下載文件。

必須在發送任何 輸出到瀏覽器之前發送HTML標頭。 PHP 使用標題功能傳遞原始的 HTML標頭。在這個例子中,我們 將從URL www.yourdomain.com/download.php?file=download.zip獲取文件名。

<? 
$dir="/path/to/file/"; 
if (isset($_REQUEST["file"])) { 
    $file=$dir.$_REQUEST["file"]; 
    header("Content-type: application/force-download"); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-length: ".filesize($file)); 
    header("Content-disposition: attachment; filename="".basename($file)."""); 
    readfile("$file"); 
} else { 
    echo "No file selected"; 
} 
?> 

我們開始設置目錄 哪裏要下載的文件位於$ DIR 。請務必不要在 $ dir中使用。然後我們檢查以確保在請求中指定了一個 文件名。 如果指定了一個文件,那麼我們將 $文件設置爲文件的路徑和 文件名。現在準備工作是 完成了將文件發送到 瀏覽器的時間。

第一個標題聲明告訴 瀏覽器期望下載。接下來的 兩個頭文件分別告訴瀏覽器 數據的格式和文件大小 。最後一個標題 聲明告訴瀏覽器該文件的名稱爲 。最後,讀取文件 聲明將該文件發送到 瀏覽器。

More information.