2010-07-15 47 views
7

這個問題說明了一切..我如何讓用戶從我的網站下載文件,並且而不是讓他們看看該文件來自哪個鏈接?我知道可能需要類似download.php這將作爲網關,但過去的階段,我不知道接下來的腳本...如果它困擾你編寫整個代碼,一些函數我應該需要使用的名字將非常方便!一個PHP腳本讓用戶從我的網站上下載一個文件,而不會泄露我網站上的實際文件鏈接?

回答

10

找到一種識別要下載的文件的方法(例如,與數據庫中某行的ID匹配的GET變量,或者沿着這些行的東西)。確保它是有效的,因爲你不希望你的用戶能夠從你的網站下載任何東西。然後,使用headerContent-Disposition來告訴瀏覽器文件應該被下載,並且readfile來輸出它。

例如:

<?php 

$id = intval($_GET['id']); 
$query = mysql_query('SELECT file_path FROM files WHERE id = ' . $id); 
if (($row = mysql_fetch_row($query)) !== false) 
{ 
    header('Content-Disposition: attachment; filename=' . basename($row[0])); 
    readfile($row[0]); 
} 
exit; 

?> 
+0

我記得使用類似的技術在csv文件中導出電子郵件地址。 Safari的mac爲內容類型標頭忽略。 – Keyo 2010-07-15 05:15:59

+0

這個腳本是否支持htaccess?我有一個htaccess規則來拒絕在方法被繞過的情況下訪問真正的URL。 「所有人都拒絕」是否也會影響到這個腳本? – 2016-12-28 19:36:38

+0

@CodigosTutoriales,.htaccess文件中的規則只會影響來自客戶端的Web請求。他們不會阻止您的服務器代碼讀取服務器上的文件。 – zneak 2016-12-28 19:39:23

1

可以使用header()功能是documented here

我建議向下滾動,並期待在第1例。它似乎正在做你想要的東西。

+0

只是Shedo Chung-Hee Surasi的一個註釋 - 第二個例子還告訴你如何指定一個不同於原始文件名的文件名(正如你在你的問題中提到的那樣)。 – jerebear 2010-07-15 04:27:53

0

readfile應該做你想要什麼。將實際文件放在Web服務器根目錄之外,並在傳回文件之前需要一些憑據。

4

你不能讓別人從URL下載文件而不讓他們知道URL。在HTTP規範下是不可能的。下載的任何東西都有一個URL。

但是,您可以擁有隻能使用一次的下載網址,或者需要通過POST方法傳遞一些特定信息。您在GET或POST變量中檢查一個標記,並在該標記使用一次後使其無效。

相關問題