如何使用huggingface.js保存Blob对象?本地存图遇报错
解决Huggingface.js文本生成图片后无法保存到本地的问题
调用Huggingface.js推理API成功拿到Blob图片数据,但执行blob.stream().pipe(fs.createWriteStream(fileName))时报错:Blob.stream(...).pipe is not a function。
问题原因
Node.js中的Blob对象stream()方法返回的是Web Stream,而fs.createWriteStream属于Node.js原生流,两者遵循不同的标准,不能直接用pipe方法连接。
解决方案
方案一:将Blob转为Buffer后写入文件
把Blob转成ArrayBuffer,再转换为Node.js的Buffer,直接写入文件,兼容性更强(支持所有Node.js版本):
const blob = await inference.textToImage({ model: 'stabilityai/stable-diffusion-2', inputs: 'award winning high resolution photo of a giant tortoise/((ladybird)) hybrid, [trending on artstation]', parameters: { negative_prompt: 'blurry', } }) const fileName = 'generated_image.jpg'; // 转换Blob为Buffer const arrayBuffer = await blob.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); // 写入文件(回调版本) fs.writeFile(fileName, buffer, (err) => { if (err) { console.log('Error:', err); return; } console.log('finished'); }); // 或者用Promise版本(更简洁) // await fs.promises.writeFile(fileName, buffer); // console.log('finished');
方案二:转换Web Stream为Node.js流(Node.js 18+)
Node.js 18及以上版本支持stream/web模块,可以把Web Stream转换成Node.js可读流,再通过pipeline处理流(推荐,自动处理错误和资源关闭):
const { pipeline } = require('stream/promises'); const { Readable } = require('stream/web'); const blob = await inference.textToImage({ model: 'stabilityai/stable-diffusion-2', inputs: 'award winning high resolution photo of a giant tortoise/((ladybird)) hybrid, [trending on artstation]', parameters: { negative_prompt: 'blurry', } }) const fileName = 'generated_image.jpg'; // 将Web Stream转为Node.js可读流 const nodeReadable = Readable.fromWeb(blob.stream()); // 使用pipeline完成流传输 try { await pipeline(nodeReadable, fs.createWriteStream(fileName)); console.log('finished'); } catch (e) { console.log('Error:', e); }
注意事项
- 若使用Node.js 18以下版本,只能用方案一;
- 方案二的
pipeline方法比手动监听finish/error更可靠,能自动处理流的异常和资源释放。
内容的提问来源于stack exchange,提问作者Ya.
相关产品推荐
相关产品推荐

