Express JS 如何将 Blob 发送到客户端

Express JS how to send Blob to client

提问人:ldekester 提问时间:11/7/2023 最后编辑:ldekester 更新时间:11/7/2023 访问量:48

问:

我正在尝试从 Web 应用程序下载文件。下载按钮在我的后端执行 POST 请求,该请求反过来编辑 Google Drive 上的文件并导出它们。 我希望把它们送回前端,但到目前为止还没有成功。

从 google drive API 导出的文件以 Blob 的形式出现,下面是一个示例:

{
id: '10i7fTyLEmhovfArrbI_1Kvk-pwWRpwU-QgCWnINSQqQ',
file: Blob {
  [Symbol(type)]: 'application/pdf',
  [Symbol(buffer)]: <Buffer 5 25 50 44 46 2d 31 2e 34 0a 25 20 e2 e3 cf d3 ... 3663411 more bytes>
}

如果我尝试只发送一个文件 Blob,就像:

router.post("/getFiles", async (req, res) => {
 const blob = await file from Google drive
 res.header("Content-Type", "application/pdf");
 res.header("Content-Length", blob.size);
 blob.stream().pipe(res);
}

在前端,我像这样处理 blob:

axios.post(address, payload)
  .then(response => {
    const blob = new Blob([response?.data], { type: "application/pdf" })
    resolve(window.URL.createObjectURL(blob));
  })
  .catch(err => reject(err));

URL 打开了 pdf 查看器,但它是空白的,标题完全是胡言乱语

如何将 Blob 从 Express 后端发送到 Web?

溶液:

解决方法是将配置 { responseType: “blob” } 添加到 post 请求

axios.post(address, payload, { responseType: "blob" })
  .then(response => {
    const blob = new Blob([response?.data], { type: "application/pdf" })
    resolve(window.URL.createObjectURL(blob));
  })
  .catch(err => reject(err));
Express Google-Drive-API Blob

评论

0赞 DuuEyn 11/7/2023
这篇文章可能会有所帮助。
0赞 ldekester 11/7/2023
谢谢 @DuuEyn 和 @K J。请求选项 { responseType: “blob” } 为我解决了这个问题。
1赞 efreed 11/7/2023
由于您有解决方案,因此您可以回答自己的问题,以便它显示在答案区域中。

答:

1赞 ldekester 11/7/2023 #1

解决方法是将配置 { responseType: “blob” } 添加到 post 请求

axios.post(address, payload, { responseType: "blob" })
  .then(response => {
    const blob = new Blob([response?.data], { type: "application/pdf" })
    resolve(window.URL.createObjectURL(blob));
  })
  .catch(err => reject(err));