NO IMAGE

網站提供下載服務時經常需要實現一個強制下載功能(即強制彈出下載對話方塊),並且檔名保持和使用者之前上傳時相同。 效果如下圖: Content Disposition

Content-Disposition

使用 HTTP Header 的 Content-Disposition: attachment 可以實現下載時強制彈出下載對話方塊。

由於HTTP協議規定,通訊內容使用US ASCII編碼,就是隻能使用英文字符集。若要使用其他字符集,必須根據RFC3986使用百分號將字串編碼。

Content-Disposition: attachment; filename=filename.ext
Content-Disposition: attachment; filename*=charset'lang'encoded-filename.ext

如果不進行編碼會出現,使用者儲存檔案檔名會是亂碼。如下圖:

Content Disposition

不過關於Content-Disposition的RFC6266規範是2011年6月才納入HTTP標準。 瀏覽器方面我測試了主流瀏覽器,Firefox 、 Chrome 、 Opera 、 Safari
,都支援新標準規定的 filename,不出意料,萬惡的IE並不支援這個規範。不過我還是很吃驚,IE10竟然也不支援filename。

按照規範輸出Content-Disposition的PHP程式碼如下:

if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $originfile ) . '"' );
}
else
{
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $originfile ) );
}

注意編碼時使用rawurlencode而不是urlencode,二者的區別在於前者把空格編碼為%20,而後者是 。在stackoverflow上關於這兩個函式有更詳細的討論,PHP
– urlencode vs rawurlencode?

Content-Type

瀏覽器對已知型別的檔案(如jpg、pdf、txt等)直接在瀏覽器內開啟,我們通過設定http頭中的 Content-Type 來改變瀏覽器認知的檔案型別。 這裡把Content-Type 設定為octet-stream,也就是二進位制檔案流。這樣瀏覽器就會直接開啟檔案,而不是在瀏覽器內開啟。

Content-Type: application/octet-stream

完整PHP程式碼

$filename = '中文檔名.txt';
header('Content-Type: application/octet-stream');
if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $originfile ) . '"' );
}
else
{
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $originfile ) );
}
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Transfer-Encoding: binary");
header('Pragma: public');
header("Content-Length: ".filesize($filename));

常見MIME型別例表:

序號

內容型別

副檔名

描述

1

application/msword

doc

Microsoft Word

2

application/octet-stream

dms lha lzh exe class

可執行程式

3

application/pdf

pdf

Adobe Acrobat

4

application/postscript

ai eps ps

PostScript

5

appication/powerpoint

ppt

Microsoft Powerpoint

6

appication/rtf

rtf

rtf 格式

7

appication/x-compress

z

unix 壓縮檔案

8

application/x-gzip

gz

gzip

9

application/x-gtar

gtar

tar 文件 (gnu 格式 )

10

application/x-shockwave-flash

swf

MacroMedia Flash

11

application/x-tar

tar

tar(4.3BSD)

12

application/zip

zip

winzip

13

audio/basic

au snd

sun/next 聲音檔案

14

audio/mpeg

mpeg mp2

Mpeg 聲音檔案

15

audio/x-aiff

mid midi rmf

Midi 格式

16

audio/x-pn-realaudio

ram ra

Real Audio 聲音

17

audio/x-pn-realaudio-plugin

rpm

Real Audio 外掛

18

audio/x-wav

wav

Microsoft Windows 聲音

19

image/cgm

cgm

計算機圖形元檔案

20

image/gif

gif

COMPUSERVE GIF 影象

21

image/jpeg

jpeg jpg jpe

JPEG 影象

22

image/png

png

PNG 影象

23

 text/html

HTML

 

24

 text/plain

 TXT

 

25

 text/xml 

XML

 

 

26            

 

 text/json  

 json字串