将 PDF 编码为 Base64 字符串并使用 Node.js Buffer.from() 会导致文件损坏

Encoding PDF to Base64 string and using Node.js Buffer.from() results in broken file

我有一个前端,用户可以在其中上传文档 (PDF)。它将这些 PDF 转换为 Base64 字符串,然后将其发送到微服务,然后再上传到 Backblaze B2。此方法在上传时工作正常,例如一个 .jpg 文件,但是当尝试使用 .pdf 文件时,它不允许我在 Backblaze 的网站上浏览文件时打开它:

这是我的前端代码:

export const toBase64 = (file: File | Blob) =>
  new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = (error) => reject(error);
  });

...

const base64String = await toBase64(acceptedFiles[index]);
onSelectFile(base64String as string);

这是我的后端代码:

const { base64String, fileName } = request.body.input;

const fileBuffer = Buffer.from(
  base64String.replace(/^data:image\/(png|gif|jpeg|jpg|pdf);base64,/, ""),
  "base64"
);

const getUploadUrlResponse = await b2.getUploadUrl({
  bucketId: process.env.BACKBLAZE_BUCKET_ID || "bucketId",
});

const uploadFileResponse = await b2.uploadFile({
  uploadUrl: getUploadUrlResponse.data.uploadUrl,
  uploadAuthToken: getUploadUrlResponse.data.authorizationToken,
  fileName: fileName,
  data: fileBuffer,
  mime: "application/pdf",
});

正如我所说,这在上传 .jpg 时效果很好,但在使用 .pdf 时导致“加载 PDF 文档失败”。我不确定我做错了什么或如何解决这个问题。

使用这个

base64String.replace(/^data:.+;base64,/, "")

而不是

base64String.replace(/^data:image\/(png|gif|jpeg|jpg|pdf);base64,/, "")

有效。