內容處置

在常規的 HTTP 響應中,**Content-Disposition** 響應頭指示內容是預期在瀏覽器中內聯顯示,即作為網頁或網頁的一部分,還是作為附件下載並儲存到本地。

multipart/form-data 主體中,HTTP **Content-Disposition** 通用頭是必須在多部分主體的每個子部分上使用的頭,以提供有關其所應用欄位的資訊。子部分由Content-Type 頭中定義的邊界分隔。在主體本身使用 Content-Disposition 不會產生任何影響。

Content-Disposition 頭在電子郵件的 MIME 訊息的更大範圍內定義,但只有可能引數的子集適用於 HTTP 表單和 POST 請求。在 HTTP 上下文中,只能使用值 form-data 以及可選指令 namefilename

頭型別 響應頭(對於主體),
請求頭響應頭(對於多部分主體的子部分)
禁止的頭名稱

語法

作為主體的響應頭

HTTP 上下文中的第一個引數是 inline(預設值,表示它可以在網頁內部顯示,或作為網頁顯示)或 attachment(表示它應該被下載;大多數瀏覽器會顯示一個“另存為”對話方塊,如果存在,則會預先填充 filename 引數的值)。

http
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"
Content-Disposition: attachment; filename*="filename.jpg"

檔名周圍的引號是可選的,但如果您在檔名中使用特殊字元,例如空格,則需要使用引號。

引數 filenamefilename* 僅在 filename* 使用 RFC 5987 中定義的編碼方面有所不同。當 filenamefilename* 都在一個頭欄位值中存在時,如果兩者都理解,則 filename*filename 更優先。建議同時包含兩者以確保最大的相容性,您可以透過將非 ASCII 字元替換為 ASCII 等效字元(例如,將 é 轉換為 e)將 filename* 轉換為 filename。您可能希望避免在 filename 中使用百分比轉義序列,因為它們在不同瀏覽器之間處理方式不一致。(Firefox 和 Chrome 會解碼它們,而 Safari 不會。)

瀏覽器可能會應用轉換以符合檔案系統要求,例如將路徑分隔符(/\)轉換為下劃線 (_)。

注意:Chrome 和 Firefox 82 及更高版本將 HTML <a> 元素download 屬性優先於 Content-Disposition: inline 引數(對於 同源 URL)。早期版本的 Firefox 會優先處理頭並會內聯顯示內容。

作為多部分主體的頭

multipart/form-data 主體需要一個 Content-Disposition 頭,為表單的每個子部分提供資訊(例如,對於每個表單欄位和作為欄位資料一部分的任何檔案)。第一個指令始終是 form-data,並且頭必須還包含一個 name 引數以識別相關的欄位。其他指令不區分大小寫,並且在 '=' 符號之後使用引號字串語法作為引數。多個引數用分號 (';') 分隔。

http
Content-Disposition: form-data; name="fieldName"
Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"

指令

name

後面跟著一個字串,其中包含表單中此子部分內容所引用的 HTML 欄位的名稱。在處理同一欄位中的多個檔案時(例如,<input type="file"> 元素的 multiple 屬性),可以有幾個具有相同名稱的子部分。

name 的值為 '_charset_' 表示該部分不是 HTML 欄位,而是用於沒有顯式字元集資訊的子部分的預設字元集。

filename

後面跟著一個字串,其中包含傳輸檔案的原始名稱。此引數主要提供指示性資訊。RFC2183 中的建議適用

  • 如果可能,請優先使用 ASCII 字元(客戶端可以對其進行百分比編碼,只要伺服器實現對其進行解碼即可)。
  • 任何路徑資訊都應被剝離,例如,透過將 / 替換為 _
  • 寫入磁碟時,它不應覆蓋現有檔案。
  • 避免建立具有安全隱患的特殊檔案,例如在命令搜尋路徑上建立檔案。
  • 滿足其他檔案系統要求,例如受限字元和長度限制。

請注意,請求頭沒有 filename* 引數,也不允許 RFC 5987 編碼。

示例

觸發“另存為”對話方塊的響應

http
200 OK
Content-Type: text/html; charset=utf-8
Content-Disposition: attachment; filename="cool.html"
Content-Length: 21

<HTML>Save me!</HTML>

這個簡單的 HTML 檔案將被儲存為常規下載,而不是在瀏覽器中顯示。大多數瀏覽器會建議將其儲存為 cool.html 檔名(預設情況下)。

使用 Content-Disposition 頭的 multipart/form-data 格式釋出的 HTML 表單示例

http
POST /test.html HTTP/1.1
Host: example.org
Content-Type: multipart/form-data;boundary="boundary"

--boundary
Content-Disposition: form-data; name="field1"

value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"

value2
--boundary--

規範

規範
超文字傳輸協議 (HTTP) 中 Content-Disposition 頭欄位的使用
# header.field.definition
從表單返回的值:multipart/form-data
# section-4.2

瀏覽器相容性

BCD 表格只能在瀏覽器中載入

另請參閱