JS调用NovelAI图片生成API获取数据异常,求排查方案
使用NovelAI图片生成API时的文件损坏问题
我在个人项目里调用NovelAI的图片生成API,遇到了以下问题:
- 查看官网F12开发者工具,能看到接口返回的Base64字符串,解码后是包含
image_0.png的完整zip文件 - 用
async fetch()或axios调用接口时,拿到的数据看似是Base64解码后的内容,但保存为zip文件后解压提示文件损坏
我的调用代码如下:
await fetch("https://api.novelai.net/ai/generate-image",{ method:"POST", headers: { 'Content-Type':'application/json', 'Authorization': `Bearer ${accessToken}`, 'Accept': "*/*" }, body:JSON.stringify({ "input": `masterpiece, best quality, ${queryparse.data.input}`, "model": model, "action": "generate", "parameters": { "width": 768, "height": 512, "scale": 11, "sampler": "k_dpmpp_2m", "steps": 28, "seed": getRandomInt(10000000000), "n_samples": 1, "ucPreset": 0, "qualityToggle": true, "sm": false, "sm_dyn": false, "dynamic_thresholding": false, "controlnet_strength": 1, "legacy": false, "add_original_image": false, "negative_prompt": "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry" } }) }).then(async (response) => { ctx.status = response.status ctx.body = (await response.text()) })
问题原因及解决方法
问题核心是你用response.text()读取接口返回数据——NovelAI图片生成API返回的是二进制zip文件,并非文本内容。用text()读取会将二进制数据按UTF-8文本解析,导致字节丢失或损坏,最终生成的zip文件无法正常解压。
正确处理方式:
- 使用
response.blob()获取完整的二进制Blob对象,保留文件原始字节 - 根据运行环境(如Node.js/Koa)将Blob转换为Buffer作为响应体,同时设置正确的响应头
修改后的fetch代码示例:
await fetch("https://api.novelai.net/ai/generate-image",{ method:"POST", headers: { 'Content-Type':'application/json', 'Authorization': `Bearer ${accessToken}`, 'Accept': "*/*" }, body:JSON.stringify({/* 原有参数保持不变 */}) }).then(async (response) => { ctx.status = response.status // 获取二进制Blob数据 const zipBlob = await response.blob() // 转换为Buffer适配Node.js环境 ctx.body = Buffer.from(await zipBlob.arrayBuffer()) // 设置响应头,让客户端识别为zip文件 ctx.set('Content-Type', 'application/zip') })
axios的正确写法:
使用axios时需设置responseType: 'arraybuffer',避免自动将二进制数据解析为文本:
axios.post("https://api.novelai.net/ai/generate-image", {/* 原有参数 */}, { headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type':'application/json' }, responseType: 'arraybuffer' }).then(response => { ctx.status = response.status ctx.body = response.data // 直接获取ArrayBuffer/Buffer ctx.set('Content-Type', 'application/zip') })
补充说明:
官网F12中看到的Base64是浏览器对二进制响应的自动编码展示,实际接口返回的是原始二进制数据,并非Base64字符串。
内容的提问来源于stack exchange,提问作者infopcgood
相关产品推荐
相关产品推荐

