Node.js中如何将图片Blob转换为本地图片文件?
解决方案:将Hugging Face API返回的Blob保存为本地图片
你代码里的核心问题是**request库返回的响应对象没有blob()方法**——这个方法是浏览器环境中Response对象的专属API,Node.js里的request返回的是Buffer或字符串,直接调用response.blob()必然报错,这就是你之前尝试失败的根本原因。
下面给你两种可行的实现方式:
方式一:使用node-fetch(推荐,适配Blob/Buffer)
node-fetch是浏览器Fetch API的Node.js实现,能直接处理Blob或获取Buffer,更贴合你的需求。
步骤1:安装依赖
npm install node-fetch fs
步骤2:修改代码并添加保存逻辑
const fetch = require('node-fetch'); const fs = require('fs').promises; async function query(data) { const url = "https://api-inference.huggingface.co/models/prompthero/openjourney"; try { const response = await fetch(url, { method: 'POST', headers: { 'Authorization': 'AUTHTOKEN-HERE!!!', 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); // 直接获取Buffer(Node.js中保存文件更高效) const buffer = await response.buffer(); // 自定义保存路径和文件名 await fs.writeFile('./generated-image.png', buffer); console.log('图片已成功保存到本地'); return buffer; } catch (err) { console.log("发生错误"); console.log(err); } } // 调用示例 query({ "inputs": "你的生成提示词" });
方式二:兼容原request库(直接处理Buffer)
如果不想更换依赖库,也可以通过配置request返回Buffer,再直接保存:
const request = require('request'); const fs = require('fs'); function query(data) { const url = "https://api-inference.huggingface.co/models/prompthero/openjourney"; return new Promise((resolve, reject) => { request({ method: 'POST', uri: url, headers: { 'Authorization': 'AUTHTOKEN-HERE!!!', 'Content-Type': 'application/json' }, body: JSON.stringify(data), encoding: null // 关键配置:让响应返回Buffer而非字符串 }, (err, response, body) => { if (err) { console.log("发生错误"); reject(err); return; } // 将Buffer写入本地文件 fs.writeFile('./generated-image.png', body, (writeErr) => { if (writeErr) { console.log("保存文件失败"); reject(writeErr); return; } console.log('图片已成功保存到本地'); resolve(body); }); }); }); } // 调用示例 query({ "inputs": "你的生成提示词" });
补充:之前转base64失败的原因
如果一定要通过base64中转,需要先把Buffer转为base64字符串,再重新转回Buffer保存(注意不要带data:image/png;base64,这类前缀):
// Buffer转base64再转回Buffer的示例 const base64Str = body.toString('base64'); const bufferFromBase64 = Buffer.from(base64Str, 'base64'); fs.writeFile('./image.png', bufferFromBase64, (err) => { // 处理保存逻辑 });
但这种方式多了一次转换,不如直接用Buffer高效,不推荐。
内容的提问来源于stack exchange,提问作者iamkuna9
相关产品推荐
相关产品推荐

