2011-03-05 152 views
0

我正在開發一個Web服務。使用此服務,用戶將上傳文件.php文件,服務將從php文件中刪除UTF8 BOM字符。然後,將有一個像這樣的鏈接:強制下載文件

<a href="uploads/as8df7/uploadedfile.php">Download Your File</a>

但是當我點擊這個鏈接,瀏覽器瀏覽到該文件。我不想瀏覽它,我想下載它。所以,當用戶點擊這個鏈接時,下載將開始。

任何想法?

(PS我不想修改uploadedfile.php文件,也是我讀到這5個問題,但我仍然有問題。)

+1

您將需要修改'uploadedfile.php'。無法繞過它 – 2011-03-05 22:23:14

+0

但是用戶會下載'uploadedfile.php'? – Eray 2011-03-05 22:26:43

+1

當前的形式,你將*執行*上傳的文件,這是一個不允許的。你需要一個傳輸腳本來發送正確的頭文件並傳遞文件的源代碼 – 2011-03-05 22:33:47

回答

1

的問題是,你允許人們上傳PHP文件在您的服務器上,然後給他們一個鏈接來執行該PHP文件。 Web服務器會自動處理那些上傳的PHP文件,就像其他任何PHP文件一樣,即執行它,這會使您面臨巨大的安全漏洞。

無論您的網絡服務有什麼目的,我都會建議您在服務器上傳文件時重命名文件(「隨機」最好,沒有擴展名),然後讓PHP腳本將文件反饋給合適的請求時設置標頭。

這樣一個腳本的URL看起來像:

http://www.example.com/get_uploaded_file.php?id=jgh3h8gjdj2389 

這將在id與服務器上的文件鏈接的價值,如果你在什麼地方保存原來的文件名(平面文件,DB ),只要您設置正確的HTTP標頭,就可以使用其原始名稱來提供它。

4

您需要提供此HTTP標頭:通過適當地配置你的Web服務器在同一時間

Content-Disposition: attachment; filename=example.txt 

您通常可以指定這爲整個目錄。如果您提到您正在使用哪個Web服務器,有人可能會建議如何執行此操作。

0

直接鏈接到PHP文件可能會最終執行它。一種方法是(像上面建議的那樣)重命名它。或者,你可以有一個downloader.php其下面做:

<?php 
header('Cache-Control: no-cache, must-revalidate'); 
header('Expires: Mon, 01 Jan 2000 01:00:00 GMT'); // some date in past 
header('Content-type: text/plain'); 
header('Content-Disposition: attachment; filename='.basename($filepath)); 
header('Content-Length: ' . filesize($filepath)); 
flush(); // or any other flush function/mechanism you use. 
readfile($filepath); 

,並將其鏈接是這樣的: <a href="./downloader.php?fileid=4ba213">Download</a>

這個方法可以讓你保留.php擴展。另外,如果PHP文件很大並且連接速度很慢,那麼它們的進度條將是準確的(因爲您已經預先刷新了內容長度)。