2009-12-01 144 views
5

鑑於:服務器上的所有上傳的PDF文件都帶有時間戳前綴。稍後用戶可以再次下載這些文件。這些(難看的)文件名在服務器上永遠不會再改變。重命名下載的PDF文件

問題:當我給出下載PDF文件的選項時,文件的名字看起來很醜,很冗長。我怎樣才能把這個名字改成合理的,這樣當用戶下載這個文件時,名字看起來不奇怪?

我是否需要複製,因爲重命名原始文件不是一個選項?對於每個可下載的文件,這不是額外的開銷嗎?顯然刪除複製的文件將是另一個額外的步驟?

一旦文件在客戶端完全下載,是否可以重命名文件?

你們有什麼建議?

回答

10

事情是這樣的:

<?php 
// We'll be outputting a PDF 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 
+0

'內容type'應該是'內容Type' ,但是。 – jensgram 2009-12-01 15:14:54

+0

@jensgram:不區分大小寫。 – BalusC 2009-12-01 15:16:10

+0

@klausbyskov:請參閱BalusC下面的評論。據他說,它不會在IE瀏覽器上工作? – understack 2009-12-01 15:18:53

0

服務的內容的文件名中的HTTP標頭的定義。看看周圍的PHP page on headers(也是評論)瞭解更多信息。

1

您需要設置的文件名在Content-Disposition頭:

$name = 'desiredname.pdf'; 
header('Content-Disposition: attachment;filename="' . $name . '"'); 

但不幸的是,這將不是由雷蒙德團隊開發的網頁瀏覽器一定被拾起。如果你想讓它在瀏覽器中也能正常工作,那麼你需要在請求路徑的最後一部分附加相同的文件名。例如:http://example.com/pdf/desiredname.pdf

+0

我認爲在技術上文件名參數不應該在引號中。如果該名稱不包含空格或有趣的字符,請不要使用引號。 – TRiG 2009-12-01 15:25:46

+0

@BalusC:這是有用的像http://stackoverflow.com/questions/698308/why-doesnt-content-disposition-header-work-in-ie-8這一個。謝謝。 – understack 2009-12-01 15:31:22

0

前段時間我在做類似的事情,通過php提供文件(在我的情況下,不要重命名它們,而是檢查下載它們的人是否已登錄並且被允許查看這些文件)。我發現pdf下載在IE中不起作用,除非我還添加了這些標頭:

header('Pragma: public'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Transfer-Encoding: binary'); 

我不知道爲什麼。試驗看看會發生什麼。

6

我需要爲最近的項目做到這一點,並且對如何實現有點困惑,但在看到克勞斯的答案後不久就明白了。爲了進一步闡述Klaus的迴應:

1)創建一個叫做「process.php」的文件。修改Klaus的代碼,以便它接受兩個參數:原始文件名和新名稱。我process.php樣子:

<?php 
$file = $_GET['file']; 
if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/pdf'); 
    header('Content-Disposition: attachment; filename='.$_GET['newFile']); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
?> 

2)創建一個指向處理器腳本的面向用戶的頁面上的鏈接:

<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a> 
+0

如果我的文件放在'myFiles'目錄中,我該如何設置路徑?我有點困惑。你能解釋我嗎? – 2014-07-30 09:08:46

+0

我發現了。我將文件名分配爲'$ file ='myFiles/sample.pdf';'。它的工作方式非常魅力......感謝代碼... +1 – 2014-07-30 09:35:58