本文档旨在解决在使用 multipart/form-data 上传 Base64 编码的 PDF 文件时,文件被错误地存储为文本而非二进制文件的问题。我们将分析常见错误,并提供正确的实现方法,确保 PDF 文件能够被正确解码和存储。
在使用 multipart/form-data 上传文件时,特别是当文件内容采用 Base64 编码时,需要格外注意 http 请求头的设置和数据体的构造,以确保服务器能够正确解析和存储文件。以下将详细介绍如何避免将 Base64 编码的 PDF 文件错误地存储为文本,而是作为二进制文件进行处理。
关键点:Content-Transfer-Encoding 的大小写
一个常见的错误是 Content-Transfer-Encoding 的值的大小写不正确。虽然 HTTP 头部名称通常不区分大小写,但是某些服务器或解析库对编码名称的大小写敏感。
错误示例:
content-type: application/pdf;charset=UTF-8 Content-Transfer-Encoding: BASE64
正确示例:
content-type: application/pdf;charset=UTF-8 Content-Transfer-Encoding: BASE64
请务必使用小写的 base64。
完整的 multipart/form-data 构造示例
以下是一个完整的 multipart/form-data 构造示例,展示了如何正确地设置请求头和数据体,以确保 Base64 编码的 PDF 文件能够被正确上传。
const boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW'; // 随机生成一个 boundary const header = { 'Content-Type': 'multipart/form-data; boundary=' + boundary, 'Authorization': 'Bearer YOUR_Access_TOKEN' // 替换为你的 Access Token }; const pdfBase64 = 'JVBERi0xLjUKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDw...'; // 替换为你的 Base64 编码的 PDF 数据 const filename = 'example.pdf'; const body = [ `--${boundary}`, 'Content-Disposition: form-data; name="attributes"', '', json.stringify({name: filename, parent: { id: '0' }}), // 替换为你的父目录 ID `--${boundary}`, `Content-Disposition: form-data; name="file"; filename="${filename}"`, 'Content-Type: application/pdf', 'Content-Transfer-Encoding: base64', '', pdfBase64, `--${boundary}--` ].join('rn'); const options = { method: 'POST', headers: header }; // 使用 fetch 或其他 HTTP 客户端发送请求 fetch('https://upload.box.com/api/2.0/files/content', { ...options, body: body }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));
代码解释:
- boundary: 用于分隔 multipart/form-data 中不同部分的分隔符。务必确保这个分隔符在文件内容中不会出现。
- header: 包含 Content-Type 和 Authorization 头部。Content-Type 必须包含正确的 boundary 值。
- pdfBase64: Base64 编码的 PDF 文件内容。
- filename: 上传的文件名。
- body: 使用模板字符串构造 multipart/form-data 的数据体。
- Content-Disposition: form-data; name=”attributes”: 包含文件属性的 JSON 对象。
- Content-Disposition: form-data; name=”file”; filename=”${filename}”: 指定文件字段的名称和文件名。
- Content-Type: application/pdf: 指定文件的 MIME 类型。
- Content-Transfer-Encoding: base64: 指定内容传输编码为 Base64。
- fetch: 使用 fetch API 发送 POST 请求。你可以使用任何你喜欢的 HTTP 客户端。
注意事项
- Base64 编码正确性: 确保 Base64 编码的 PDF 数据是有效的。可以使用在线 Base64 解码器验证。
- MIME 类型: Content-Type 必须设置为 application/pdf。
- Boundary 选择: 选择一个足够复杂的 boundary,以避免与文件内容冲突。
- 换行符: 使用 rn 作为行尾分隔符,这是 HTTP 协议的要求。
- 服务器端处理: 确保服务器端能够正确解析 multipart/form-data,并支持 Base64 解码。
总结
正确处理 Base64 编码的 PDF 文件上传,关键在于:
- 确保 Content-Transfer-Encoding 的值为小写的 base64。
- 正确构造 multipart/form-data 的数据体,包括 Content-Disposition、Content-Type 和 Content-Transfer-Encoding 等头部。
- 使用正确的行尾分隔符 rn。
- 确保服务器端能够正确解析 multipart/form-data,并支持 Base64 解码。
通过遵循这些步骤,可以避免将 Base64 编码的 PDF 文件错误地存储为文本,而是作为二进制文件进行处理。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END