正确处理 Base64 编码的 PDF 文件上传为二进制文件

正确处理 Base64 编码的 PDF 文件上传为二进制文件

本文档旨在解决在使用 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));

代码解释:

  1. boundary: 用于分隔 multipart/form-data 中不同部分的分隔符。务必确保这个分隔符在文件内容中不会出现。
  2. header: 包含 Content-Type 和 Authorization 头部。Content-Type 必须包含正确的 boundary 值。
  3. pdfBase64: Base64 编码的 PDF 文件内容。
  4. filename: 上传的文件名。
  5. 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。
  6. fetch: 使用 fetch API 发送 POST 请求。你可以使用任何你喜欢的 HTTP 客户端。

注意事项

  • Base64 编码正确性: 确保 Base64 编码的 PDF 数据是有效的。可以使用在线 Base64 解码器验证。
  • MIME 类型: Content-Type 必须设置为 application/pdf。
  • Boundary 选择: 选择一个足够复杂的 boundary,以避免与文件内容冲突。
  • 换行符: 使用 rn 作为行尾分隔符,这是 HTTP 协议的要求。
  • 服务器端处理: 确保服务器端能够正确解析 multipart/form-data,并支持 Base64 解码。

总结

正确处理 Base64 编码的 PDF 文件上传,关键在于:

  1. 确保 Content-Transfer-Encoding 的值为小写的 base64。
  2. 正确构造 multipart/form-data 的数据体,包括 Content-Disposition、Content-Type 和 Content-Transfer-Encoding 等头部。
  3. 使用正确的行尾分隔符 rn。
  4. 确保服务器端能够正确解析 multipart/form-data,并支持 Base64 解码。

通过遵循这些步骤,可以避免将 Base64 编码的 PDF 文件错误地存储为文本,而是作为二进制文件进行处理。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享