2008-12-19 55 views
4

我在一個網站上做了一些工作,該網站有一個安全的區域,只有在用戶登錄後纔可以使用。在這個區域有一個鏈接到pdf文檔的頁面,可以下載。物理文檔不在網站的根目錄中。在PDF文檔中的鏈接是這個樣子:使用正確的文件名在瀏覽器中安全地下載文件

index.php頁面=安全區域/下載文件& = protected.pdf

它執行以下(注:我知道這是必經之路強制下載,而不是打開文件瀏覽器):

// check security, get filename from request, prefix document download directory and check for file existance then... 

header('Content-Type: application/pdf'); 
header('Content-Disposition: attachment; filename="' . basename($file) . '"'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: ' . filesize($file)); 
header('Connection: Close'); 
set_time_limit(0); 
readfile($file); 

這種運作良好,但在Firefox 3和Internet Explorer 7(我還沒有與其他任何瀏覽器進行測試)將不能打開此文件在瀏覽器內部,它們都顯示下載對話框(如預期的那樣)。如果選擇「打開」而不是「保存」,則會下載文檔,並在瀏覽器之外啓動Adobe Reader以呈現文檔。

我遇到的問題是在瀏覽器中下載文件,並保存了正確的默認文件名。

我想要在瀏覽器中打開文檔。這樣做的一種方法是使用標題「Content-Disposition:inline;」但這意味着我無法指定文件名(因爲瀏覽器似乎被忽略)。有這樣做的問題是,當我保存文檔,默認名是該URL,而不是PDF文檔的文件名:

http___example.com_index.php_page=secure_area_download&file=protected.pdf 

我怎樣才能得到Firefox和Internet Explorer打開裏面的文件瀏覽器並提供正確的默認文件名以保存?

回答

6

我終於想出瞭解決這個問題的方法。

雖然RFC 2183顯示文件名參數可以用於Content-Disposition標頭字段的附件和內聯,但似乎瀏覽器在使用內聯時忽略文件名參數,而是嘗試計算出文件名應該基於URL。如果URL沒有查詢字符串,那麼跟在last /後面的URL部分似乎被用作文件名。

我已經更改了下載受保護PDF文檔的鏈接,以使用不包含查詢字符串的好網址,並使用帶有.htaccess文件的mod_rewrite將這些好網址轉換爲使用正確參數執行正確腳本:

舊鏈接:

index.php?page=secure-area/download&file=document.pdf 

新建鏈接:

file/secure-area/download/document.pdf 

。htaccess的:

RewriteEngine On 
RewriteRule ^file/secure-area/download/(.*)$ index.php?page=secure-area/download&file=$1 [L] 

用於實際發送文件的腳本是爲我所用之前(注意這個問題的例子同樣使用內容處置:附件而不是內容處置:內聯展示瀏覽器保存文檔使用正確的文件名時,不是內聯)。

// check security, get filename from request, prefix document download directory and check for file existance then... 
header('Content-Type: application/pdf'); 
header('Content-Disposition: inline; filename="' . basename($file) . '"'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: ' . filesize($file)); 
header('Connection: Close'); 
set_time_limit(0); 
readfile($file); 

現在PDF文檔的瀏覽器中打開並保存時默認的文件名是

document.pdf 

,而不是

http___example.com_index.php_page=secure_area_download&file=document.pdf 

IE 7中的文件名轉換空格+的和單獨引號到%27的時候保存(Firefox不),我想停止發生,但同時我很滿意我得到的。

+0

我非常想要投下這個票,因爲它沒有回答這個問題,但可能沒有令人滿意的答案。 – mjaggard 2012-12-04 10:25:57

+0

@mjaggard其實它回答我的問題。 – 2013-01-30 10:21:24

1

使用

Content-Disposition: inline; 
+0

這並不能解決我遇到的問題。我知道如何讓文檔在瀏覽器中打開。當在瀏覽器中打開文件時,我不知道如何爲文件指定文件名,這就是這個問題的含義。 – 2008-12-19 21:29:22

-1

你告訴它這樣做,嘗試使用內容處置:附件。嘗試使用內容處置:內聯。

+0

這並不能解決我遇到的問題。我知道如何讓文檔在瀏覽器中打開。當在瀏覽器中打開文件時,我不知道如何爲文件指定文件名,這就是這個問題的含義。 – 2008-12-19 21:30:18

0

不,她在說的是使用'Content-disposition:inline'時無法指定文件名。 'Filename'只在使用'Content-disposition:attachment'時使用,如她的第一個例子。這會導致正在使用正確的文件名下載文檔。然而,這個解決方案試圖實現的是一個呈現INLINE的文檔,當從瀏覽器下載時使用正確的文件名,而不是腳本名稱。

當使用'inline'而不是url重寫時,是否有任何其他方式指定文件名?我編寫的用於呈現文檔的頁面需要數據庫ID,因此我認爲重寫會更困難(文件名必須從數據庫中查詢)。

0

Content-disposition:inline可與文件名一起使用。但只有一些瀏覽器承諾並遵循這一點。只有當您自己保存文件名時纔會看到效果,您將使用您使用內容處置定義的文件名。

相關問題