multipart/form-data 是一种 MIME 类型,用于表示包含多个部分的表单数据。它通常用于通过 HTTP 请求上传文件或提交包含文件的表单数据。每个部分都有自己的内容类型和内容描述。
结构
multipart/form-data 的每个部分由以下几部分组成:
- 边界(Boundary):用于分隔不同部分的字符串。
- 头部(Headers):描述该部分的内容类型和其他元数据。
- 内容(Body):实际的数据内容。
示例
假设有一个包含文本字段和文件上传的表单:
<form id="myForm" enctype="multipart/form-data" method="post">
<input type="text" name="username" value="JohnDoe">
<input type="file" name="profilePicture">
<button type="submit">Submit</button>
</form>
提交该表单时,浏览器会生成如下的 multipart/form-data 请求:
POST /submit HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"
JohnDoe
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="profilePicture"; filename="profile.jpg"
Content-Type: image/jpeg
(binary data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
使用 FormData 对象构建 multipart/form-data
你可以使用 JavaScript 的 FormData 对象来构建和发送 multipart/form-data 请求。
示例代码
var formElement = document.getElementById('myForm');
var formData = new FormData(formElement);
fetch('https://api.example.com/submit', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => console.log('Success:', data))
.catch(error => console.error('Error:', error));
服务器端解析
在服务器端,可以使用不同的库来解析 multipart/form-data 请求。例如,在 Node.js 中可以使用 multer 中间件。
示例代码
const express = require('express');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
const app = express();
app.post('/submit', upload.single('profilePicture'), (req, res) => {
console.log(req.body.username); // JohnDoe
console.log(req.file); // 文件信息
res.send('File uploaded successfully');
});
app.listen(3000, () => console.log('Server running on port 3000'));