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
相关产品推荐
相关产品推荐

