在常規的 HTTP 應答中,Content-Disposition 響應頭指示回復的內容該以何種形式展示,是以內聯的形式(即網頁或者頁面的一部分),還是以附件的形式下載並保存到本地。
在 multipart/form-data 類型的應答消息體中,Content-Disposition 消息頭可以被用在 multipart 消息體的子部分中,用來給出其對應字段的相關信息。各個子部分由在Content-Type 中定義的分隔符分隔。用在消息體自身則無實際意義。
Content-Disposition 消息頭最初是在 MIME 標准中定義的,HTTP 表單及 POST 請求只用到了其所有參數的一個子集。只有 form-data 以及可選的 name 和 filename 三個參數可以應用在HTTP場景中。
作為消息主體中的消息頭
在 HTTP 場景中,第一個參數或者是 inline(默認值,表示回復中的消息體會以頁面的一部分或者整個頁面的形式展示),或者是 attachment(意味着消息體應該被下載到本地;大多數瀏覽器會呈現一個“保存為”的對話框,將 filename 的值預填為下載后的文件名,假如它存在的話)
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"
作為multipart body中的消息頭
在 HTTP 場景中。第一個參數總是固定不變的 form-data;附加的參數不區分大小寫,並且擁有參數值,參數名與參數值用等號('=')連接,參數值用雙引號括起來。參數之間用分號(';')分隔。
Content-Disposition: form-data
Content-Disposition: form-data; name="fieldName"
Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"
指令
name
后面是一個表單字段名的字符串,每一個字段名會對應一個子部分。在同一個字段名對應多個文件的情況下(例如,帶有 multiple 屬性的 <input type=file >
元素),則多個子部分共用同一個字段名。如果 name 參數的值為 'charset' ,意味着這個子部分表示的不是一個 HTML 字段,而是在未明確指定字符集信息的情況下各部分使用的默認字符集。
filename
后面是要傳送的文件的初始名稱的字符串。這個參數總是可選的,而且不能盲目使用:路徑信息必須舍掉,同時要進行一定的轉換以符合服務器文件系統規則。這個參數主要用來提供展示性信息。當與 Content-Disposition: attachment 一同使用的時候,它被用作"保存為"對話框中呈現給用戶的默認文件名。
filename*
"filename" 和 "filename" 兩個參數的唯一區別在於,"filename" 采用了 RFC 5987 中規定的編碼方式。當 "filename" 和 "filename" 同時出現的時候,應該優先采用 "filename",假如二者都支持的話。
示例
以下是一則可以觸發"保存為"對話框的服務器應答:
200 OK
Content-Type: text/html; charset=utf-8
Content-Disposition: attachment; filename="cool.html"
Content-Length: 22
<HTML>Save me!</HTML>