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

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文件无法正常解压。

正确处理方式:

  1. 使用response.blob()获取完整的二进制Blob对象,保留文件原始字节
  2. 根据运行环境(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:40:38