MIME 类型(Multipurpose Internet Mail Extensions) 是一种标准,用于描述互联网上传输文件的数据类型,它告诉接收方(比如浏览器、服务器等)如何正确处理数据。MIME 类型是根据文件的性质和格式在 Internet 上标识文件的标准方法,而 Content-Type 标头使用 MIME 类型来指示正在发送或接收的资源类型。
MIME 类型由两部分组成,使用斜杠分隔:
内容是可以直接以文本形式查看和编辑的,适合显示在浏览器中或通过文本编辑器查看,通常采用字符编码(如 UTF-8、ASCII 等),而不是二进制编码。
POST /api/message HTTP/1.1
Content-Type: text/plain
Content-Length: 27
Hello, this is a plain text message.
POST /submit-form HTTP/1.1
Content-Type: text/html
Content-Length: 65
Form Data
User Information
Name: John Doe
Email: [email protected]
POST /upload-css HTTP/1.1
Content-Type: text/css
Content-Length: 45
body {
background-color: #f0f0f0;
font-family: Arial, sans-serif;
}
h1 {
color: #333;
}
POST /execute-script HTTP/1.1
Content-Type: text/javascript
Content-Length: 39
document.getElementById('output').innerHTML = 'Hello World';
application/ 类型的内容可能包含任意类型的数据,包括二进制格式、文件格式、加密内容等。
POST /api/user HTTP/1.1
Content-Type: application/json
Content-Length: 52
{
"name": "John Doe",
"email": "[email protected]",
"age": 30
}
POST /api/user HTTP/1.1
Content-Type: application/xml
Content-Length: 98
John Doe
[email protected]
30
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 34
username=johndoe&password=secret123
POST /upload HTTP/1.1
Content-Type: application/octet-stream
Content-Length: 2097152
<二进制文件内容>
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=------------------------abcdef123456
Content-Length: 429
--------------------------abcdef123456
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg
<文件的二进制数据>
--------------------------abcdef123456
Content-Disposition: form-data; name="description"
This is an image of a sunset.
--------------------------abcdef123456--
由于 multipart/form-data 类型较其他类型更加复杂,因此介绍其中每个部分如下:
1. Boundary
boundary=------------------------abcdef123456 是分隔符,用于将不同的部分分隔开。在实际请求中,boundary 是唯一的,可以防止不同部分混淆。这个 boundary 值是由浏览器自动生成的,并用于标识各部分数据的开始和结束。
2. 文件字段
Content-Disposition: form-data; name="file"; filename="image.jpg":这里指定了文件字段的名称(file),以及上传的文件名(image.jpg)。
Content-Type: image/jpeg:表示上传的文件类型是 image/jpeg,即一张 JPEG 图片。
<文件的二进制数据>:这里是实际的文件内容,浏览器会将文件的二进制数据放在这里。
3. 普通字段
Content-Disposition: form-data; name="description":表示这是一个名为 description 的字段。
This is an image of a sunset.:这是表单中的普通文本字段内容,即用户提供的描述信息。
4. 分隔符结尾
请求体的结尾以 --------------------------abcdef123456-- 标识,表示所有部分的结束。
对比 application/octet-stream 和 multipart/form-data
application/octet-stream |
multipart/form-data |
|
---|---|---|
数据结构 | 一个完整的二进制流 | 数据被分割成多个部分(每个部分由 boundary 分隔) |
数据类型 | 没有数据类型限制,适用于任何类型的二进制数据 | 可以包含多个不同的数据类型(文件、文本、数字等) |
处理方式 | 数据是单一的二进制流 | 每部分数据都有独立的头部信息(如字段名、文件名等) |
适用场景 | 单一文件上传、下载或传输原始二进制数据 | 多部分表单提交,尤其是文件上传与文本字段混合的场景 |
典型请求格式 | 文件数据直接作为二进制流发送 | 通过 boundary 分隔的多个数据块组成请求体 |
Content-Type header - HTTP | MDN
Media types (MIME types) - HTTP | MDN