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

从WhatsApp Hook接收MIME格式数据,如何在Node.js中生成文件?

问题描述

我通过WhatsApp Hook接收到了MIME格式的媒体数据,数据示例如下:

JFIF  C   


        
%# , #&')*)-0-(0%()(  C   



(((((((((((((((((((((((((((((((((((((((((((((((((((   @"   

我尝试使用以下Node.js代码创建文件,但存在问题,想咨询如何根据该MIME格式的响应正确生成文件:

axios.get(
    ImageURL,
    {
        headers: {
            Authorization: 'Bearer {Token}',
        }
    })
    .then( response => {
        
        fs('image.jpeg', {utf8: true}, response.data,(err)=>{

        })
        return res.status(200).json({
            success: true,
            r,
            message: 'Successfully Created',
        });
    }).
catch(err => {
console.log(err)
});
解决方案

你的代码存在几个关键问题,导致生成的图片文件损坏,以下是修复方案:

  • 未指定响应类型为二进制:axios默认会把响应解析为字符串,而图片是二进制数据,必须在请求配置中添加responseType: 'arraybuffer'或'stream',才能正确获取原始二进制内容。
  • fs API调用错误:你使用的fs()不是Node.js标准文件系统方法,应该用fs.writeFile()或fs.createWriteStream();同时不能指定utf8编码,二进制文件不需要文本编码。
  • 错误处理缺失:文件写入的回调中没有处理错误,无法排查写入失败的问题。

修复后的代码(arraybuffer 方式,适合小/中型文件):

const axios = require('axios');
const fs = require('fs').promises;

axios.get(ImageURL, {
    headers: {
        Authorization: 'Bearer {Token}'
    },
    responseType: 'arraybuffer' // 关键:告知axios返回二进制数据
})
.then(async response => {
    await fs.writeFile('image.jpeg', response.data); // 直接写入二进制数据,无需编码
    return res.status(200).json({
        success: true,
        message: 'Successfully Created'
    });
})
.catch(err => {
    console.error('处理出错:', err);
    return res.status(500).json({
        success: false,
        message: '图片处理失败'
    });
});

流式处理方式(适合大文件,避免内存占用过高):

const axios = require('axios');
const fs = require('fs');

axios.get(ImageURL, {
    headers: {
        Authorization: 'Bearer {Token}'
    },
    responseType: 'stream' // 用流处理大文件更高效
})
.then(response => {
    return new Promise((resolve, reject) => {
        const writeStream = fs.createWriteStream('image.jpeg');
        response.data.pipe(writeStream);
        writeStream.on('finish', resolve);
        writeStream.on('error', reject);
    });
})
.then(() => {
    return res.status(200).json({
        success: true,
        message: 'Successfully Created'
    });
})
.catch(err => {
    console.error('处理出错:', err);
    return res.status(500).json({
        success: false,
        message: '图片处理失败'
    });
});

核心要点:

  • responseType: 'arraybuffer':让axios返回原始二进制缓冲区,适合小到中等大小的文件。
  • responseType: 'stream':流式处理大文件,避免一次性加载整个文件到内存。
  • 写入文件时不要指定编码,直接传入二进制数据即可,fs.writeFile会自动处理二进制内容。
  • 必须处理请求和文件写入过程中的错误,便于排查问题。

内容的提问来源于stack exchange,提问作者Umer Ibrahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:25:15