內容處置
在常規的 HTTP 響應中,**Content-Disposition** 響應頭指示內容是預期在瀏覽器中內聯顯示,即作為網頁或網頁的一部分,還是作為附件下載並儲存到本地。
在 multipart/form-data 主體中,HTTP **Content-Disposition** 通用頭是必須在多部分主體的每個子部分上使用的頭,以提供有關其所應用欄位的資訊。子部分由Content-Type 頭中定義的邊界分隔。在主體本身使用 Content-Disposition 不會產生任何影響。
Content-Disposition 頭在電子郵件的 MIME 訊息的更大範圍內定義,但只有可能引數的子集適用於 HTTP 表單和 POST 請求。在 HTTP 上下文中,只能使用值 form-data 以及可選指令 name 和 filename。
語法
作為主體的響應頭
HTTP 上下文中的第一個引數是 inline(預設值,表示它可以在網頁內部顯示,或作為網頁顯示)或 attachment(表示它應該被下載;大多數瀏覽器會顯示一個“另存為”對話方塊,如果存在,則會預先填充 filename 引數的值)。
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"
Content-Disposition: attachment; filename*="filename.jpg"
檔名周圍的引號是可選的,但如果您在檔名中使用特殊字元,例如空格,則需要使用引號。
引數 filename 和 filename* 僅在 filename* 使用 RFC 5987 中定義的編碼方面有所不同。當 filename 和 filename* 都在一個頭欄位值中存在時,如果兩者都理解,則 filename* 比 filename 更優先。建議同時包含兩者以確保最大的相容性,您可以透過將非 ASCII 字元替換為 ASCII 等效字元(例如,將 é 轉換為 e)將 filename* 轉換為 filename。您可能希望避免在 filename 中使用百分比轉義序列,因為它們在不同瀏覽器之間處理方式不一致。(Firefox 和 Chrome 會解碼它們,而 Safari 不會。)
瀏覽器可能會應用轉換以符合檔案系統要求,例如將路徑分隔符(/ 和 \)轉換為下劃線 (_)。
作為多部分主體的頭
multipart/form-data 主體需要一個 Content-Disposition 頭,為表單的每個子部分提供資訊(例如,對於每個表單欄位和作為欄位資料一部分的任何檔案)。第一個指令始終是 form-data,並且頭必須還包含一個 name 引數以識別相關的欄位。其他指令不區分大小寫,並且在 '=' 符號之後使用引號字串語法作為引數。多個引數用分號 (';') 分隔。
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 編碼。
示例
觸發“另存為”對話方塊的響應
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 表單示例
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 表格只能在瀏覽器中載入
另請參閱
- HTML 表單
- 定義多部分主體邊界的
Content-Type。 - 用於準備表單資料以在
fetch()或XMLHttpRequestAPI 中使用的FormData介面。