2011-07-21 57 views
0

我允許用戶上傳文件到服務器。但是,我不希望他們明顯看到文件的存儲位置。我能做什麼,將允許他們仍然得到文件,但沒有看到文件的位置。如何防止顯示文件位置?

+1

爲什麼他們會看到被存儲的文件在哪裏? – Mike

+0

爲了向他們提供文件,會有鏈接下載,對吧? – KPO

+0

正在談論上傳(客戶端發送文件到服務器)還是下載(客戶端從服務器上拉文件)? – Mike

回答

3

您可以使用PHP查詢做到這一點,可以說你使用以下網址:

http://mysite.com/files.php?file=xyz.pdf 

在files.php可以檢查得到變量文件,並且具有檢索文件中的硬編碼功能。您可以通過使用頭來強制下載或將文件讀入var並將其內容打印到頁面中來以多種方式執行此操作。對於像PDF閱讀文件並將其打印到頁面與將其鏈接到文件相同。

雖然警告:與使用標題一樣,除了文件外,不會在頁面上打印任何內容。如果您閱讀文件並打印它,以便最終用戶不會得到作爲文件來源的gopbly goop(即jpg或pdf),我還建議您繼續聲明頭文件。

哦不,我忘了標題警告,自從Adobe爲PDF的開放源代碼製作ISO標準以來,我一直在遇到標題問題,具體取決於生成PDF的應用程序和用戶上傳的瀏覽器來自頭部PDF將是什麼:

'application/pdf', 'application/x-download','application/octet-stream','application/octet','binary/octet-stream' 

所以要小心硬編碼上傳部分頭型,我知道這個問題是關於下載,但我只是想我會扔在那裏。同樣使用頭文件下載並不重要,我只是簡單地使用標準的應用程序/ PDF。

+0

+1這不僅僅是打字的速度。這是關於提供一個很好的答案。 – Mike

+0

謝謝。難道真的有一個ID,所以一旦人去page.php?id = idjfkldj彈出窗口會打開,要求他們打開/保存? – KPO

+1

@KPO yes但是您必須創建一個數據庫並將ID和文件名存儲在表中。它只會增加更多的工作和更多的安全性。所以這取決於你。 – BrandonS

1

使用一些可以映射到真實文件的隨機唯一ID存儲它,然後使用實際文件上的readfile()腳本來提供它。

http://php.net/readfile文檔也有一個關於如何強制下載的例子。

+0

真的嗎?同樣的答案,並在我的秒內發佈,但已經有了投票?哦,不得不打字得更快我認爲那裏的工作很好Tino。 – BrandonS

+0

我並沒有試圖進入一個快速的。我剛剛發佈了我認爲足夠的信息,供他進一步調查並找到可行的方案。 –

+0

哦,不,男人,我只是說我倒黴,沒有什麼大不了的,這一切都是在開玩笑的態度,我沒有心煩意亂。 – BrandonS

2

有待辦事項這幾種方法,但我更喜歡使用的.htaccess

所以我的鏈接看起來像在URL中http://example.com/files/filename.zip 額外的參數可以用來像一個用戶名或密碼:

http://example.com/files/bob/filename.zip 

http://example.com/files/18d52c/filename.zip 

然後可以檢查數據庫,看看是否允許用戶下載該特定文件,就像您在付款後用於即時下載一樣..但基本方法將如下所示:

的.htaccess

RewriteRule ^files/(.*)$ serve.php?file=$1 

serve.php

<?php 
if(isset($_GET['file'])){ 
    $file=basename($_GET['file']); 
    //Protect the index.php && serve.php 
    if(basename($_GET['file'])=='index.php' || basename($_GET['file'])=='serve.php'){ 
     header("HTTP/1.1 403 Forbidden");die(); 
    } 
    $downloadFolder="original_location/"; 
    if(file_exists($downloadFolder.$file)){ 

     $fsize = filesize($downloadFolder.$file); 
     $ctype=finfo_file(finfo_open(FILEINFO_MIME_TYPE), $downloadFolder.$file); 

     if(ini_get('zlib.output_compression')) 
     ini_set('zlib.output_compression', 'Off'); 

     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private",false); 
     if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) { 
      header("Content-Type: application/force-download"); 
      header('Content-Description: File Transfer'); 
     }else{ 
      header("Content-Type: $ctype"); 
     } 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\";"); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Length: ".$fsize); 

     ob_clean(); 
     flush(); 
     readfile('original_location/'.$file); 
    }else{ 
     header("HTTP/1.0 404 Not Found"); 
    } 
    die(); 
} 
header("HTTP/1.0 404 Not Found"); 
?> 

original_location/index.php文件

header("HTTP/1.1 403 Forbidden"); 
+0

您可以使用http://www.php.net/manual/en/ref.fileinfo.php替換整個MIME類型的業務... –

+0

感謝您添加了您的建議。 –

+0

+1美麗的實現那裏勞倫斯,它涵蓋了所有的基礎和錯誤情況。我現在對我的回答幾乎感到羞愧,我的意思是我基​​本上告訴過他同樣的事情,但是你的代碼覆蓋了所有的基礎,如果你不介意我想將它添加到我的代碼庫中,當然可以參考你的代碼。 – BrandonS