什么是 MIME 类型?
MIME 类型(Multipurpose Internet Mail Extensions) 是一种标准,用于描述互联网上传输文件的数据类型,它告诉接收方(比如浏览器、服务器等)如何正确处理数据。MIME 类型是根据文件的性质和格式在 Internet 上标识文件的标准方法,而 Content-Type 标头使用 MIME 类型来指示正在发送或接收的资源类型。
MIME 类型的结构
MIME 类型由两部分组成,使用斜杠分隔:
- 主类型:代表文件的大类(例如:text、image、audio 等)。
- 子类型:进一步定义该类的具体类型(例如:text/plain、image/png、audio/mpeg 等)。
常见的 MIME 类型
text 类型
内容是可以直接以文本形式查看和编辑的,适合显示在浏览器中或通过文本编辑器查看,通常采用字符编码(如 UTF-8、ASCII 等),而不是二进制编码。
text/plain:纯文本格式
POST /api/message HTTP/1.1
Content-Type: text/plain
Content-Length: 27
Hello, this is a plain text message.
text/html:HTML 格式
POST /submit-form HTTP/1.1
Content-Type: text/html
Content-Length: 65
<!DOCTYPE html>
<html lang="en">
<head>
<title>Form Data</title>
</head>
<body>
<h1>User Information</h1>
<p>Name: John Doe</p>
<p>Email: john@example.com</p>
</body>
</html>
text/css:CSS 格式
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;
}
text/javascript:JavaScript 格式
POST /execute-script HTTP/1.1
Content-Type: text/javascript
Content-Length: 39
document.getElementById('output').innerHTML = 'Hello World';
application 类型
application/ 类型的内容可能包含任意类型的数据,包括二进制格式、文件格式、加密内容等。
application/json:JSON 格式数据
POST /api/user HTTP/1.1
Content-Type: application/json
Content-Length: 52
{
"name": "John Doe",
"email": "john@example.com",
"age": 30
}
application/xml:XML格式数据
POST /api/user HTTP/1.1
Content-Type: application/xml
Content-Length: 98
<user>
<name>John Doe</name>
<email>john@example.com</email>
<age>30</age>
</user>
application/x-www-form-urlencoded:表单数据
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 34
username=johndoe&password=secret123
application/octet-stream:通用的二进制数据,常用于文件上传或下载
POST /upload HTTP/1.1
Content-Type: application/octet-stream
Content-Length: 2097152
<二进制文件内容>
Multipart 类型
multipart/form-data:用于表单数据提交,尤其是文件上传
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 分隔的多个数据块组成请求体 |
图像、音频、视频类型
- image/jpeg:JPEG 图像
- image/png:PNG 图像
- image/gif:GIF 图像
- audio/mpeg:MP3 音频文件
- video/mp4:MP4 视频文件
参考
Content-Type header - HTTP | MDN
Media types (MIME types) - HTTP | MDN