You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express.js中API获取Blob转Blob及转发Blob数据实现问询

问题解决:Express中处理Blob文件转换与返回

1. 将二进制字符串转换为Blob对象

Node.js环境中不能直接照搬浏览器的Blob处理逻辑,需要先把二进制字符串转成Buffer,再构建Blob:

// 假设response.data是返回的二进制字符串
const buffer = Buffer.from(response.data, 'binary');
// 根据实际文件类型设置type,也可从响应头获取
const blob = new Blob([buffer], { type: 'application/octet-stream' });

注:如果能从原API响应头response.headers['content-type']拿到准确的MIME类型,替换application/octet-stream会更适配不同文件。

2. Express路由向前端返回二进制文件

不需要先转成Blob,直接通过Express的响应对象返回Buffer即可,同时设置正确的响应头适配下载逻辑:

app.get('/proxyapi/crop/advisory/file', function (req, res) {
  axios.get(apiUrl, {
    responseType: 'arraybuffer', // Node环境下用arraybuffer替代blob,避免自动转字符串
    headers: {
      "Authorization": `Bearer ${token}`
    }
  })
  .then(function (response) {
    // 动态获取原API的文件类型和文件名
    const contentType = response.headers['content-type'] || 'application/octet-stream';
    let filename = 'default-file';
    const dispositionHeader = response.headers['content-disposition'];
    if (dispositionHeader) {
      const filenameMatch = dispositionHeader.match(/filename="?([^"]+)"?/);
      if (filenameMatch) filename = filenameMatch[1];
    }

    // 设置响应头,触发前端下载
    res.setHeader('Content-Type', contentType);
    res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
    // 直接发送二进制Buffer
    res.send(Buffer.from(response.data));
  })
  .catch(function (error) {
    console.log(error);
    res.status(500).send('文件下载失败');
  });
})

核心要点:

  • 把axios的responseType改为arraybuffer,避免Node环境下自动将二进制数据转成字符串。
  • 复用原API返回的Content-Type和Content-Disposition头,自动适配不同文件类型和文件名。
  • 用res.send直接传输Buffer,Express会自动处理二进制数据的响应逻辑。

内容的提问来源于stack exchange,提问作者Deepika Rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:27:46