2010-08-13 52 views
6

我有圖像列表,我想要一個「下載」鏈接以及每個圖像,以便用戶可以下載圖像。如何強制一個文件在PHP下載

所以有人可以指導我如何提供下載鏈接的任何文件在PHP?

編輯

我想顯示在點擊下載鏈接,我不想。如果要強制導航到圖像上的瀏覽器

+4

'download'? – RaYell 2010-08-13 11:33:49

+1

@RaYell他說*在PHP *中。所以它實際上是'回聲'download';':P – 2010-08-13 11:36:37

回答

29

要顯示的下載面板下載後,您可以使用像下面這樣:

<?php 
    // Fetch the file info. 
    $filePath = '/path/to/file/on/disk.jpg'; 

    if(file_exists($filePath)) { 
     $fileName = basename($filePath); 
     $fileSize = filesize($filePath); 

     // Output headers. 
     header("Cache-Control: private"); 
     header("Content-Type: application/stream"); 
     header("Content-Length: ".$fileSize); 
     header("Content-Disposition: attachment; filename=".$fileName); 

     // Output file. 
     readfile ($filePath);     
     exit(); 
    } 
    else { 
     die('The provided file path is not valid.'); 
    } 
?> 

如果您只是鏈接到這個腳本使用正常的鏈接文件將被下載。

順便提一下,上面的代碼片段需要在頁面的開頭執行(在任何頭文件或HTML輸出發生之前)。還要小心如果您決定創建一個基於此功能的函數來下載任意文件 - 你需要確保你防止目錄遍歷(realpath很方便),只允許從定義區域內下載,等等,如果你接受來自$ _GET或$ _POST的輸入。

+0

確切地說我想要這個,但是我怎樣才能連接它像「下載」點擊哪個腳本應該被執行 – 2010-08-13 11:46:50

+0

Opps - 好點。我會更新我的答案。 – 2010-08-13 11:50:48

+1

+1嘿,夥計,它的工作,但下載的文件發現損壞,我無法打開圖像。 – 2010-08-13 11:55:26

1

的解決方案更容易,你認爲;)使用簡單:

header('Content-Disposition: attachment'); 

而這一切。 Facebook例如也是這樣。

0

您可以在.htaccess中執行此操作,並指定不同的文件擴展名。這樣做比編寫應用程序更容易。

<FilesMatch "\.(?i:pdf)$"> 
    ForceType application/octet-stream 
    Header set Content-Disposition attachment 
</FilesMatch> 

順便說一句,您可能需要清除瀏覽器緩存才能正常工作。 <a>標籤的

+0

而不是添加相同的答案,重複您可能會考慮標記的問題,您發現的問題同樣重複。 – bummi 2013-08-05 14:46:57

+1

它們不重複。他們都是不同的問題,但有類似的可能解決方案。每個問題的個別答案可能與人更相關,因此將其標記爲重複可能會破壞有用的信息。這只是我給出的答案可能對一些搜索這些問題的人有用。當我自己試圖找到答案時,我回答的所有這些問題都出現在Google搜索中。我花了很長時間才找到解決方案,而且我想回答每一個問題,以便任何搜索者都知道這個解決方案。 – 2013-08-06 04:44:20

1

在HTML5 download屬性可以用來:如果href屬性被設置僅用於

echo '<a href="path/to/file" download>Download</a>'; 

該屬性。

允許的值沒有限制,瀏覽器將自動檢測到正確的文件擴展名並將其添加到文件 (.img,.pdf,.txt,.html等)。

瞭解更多here