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

Node.js上传图片到Backblaze B2调用b2.uploadFile返回400错误如何解决?

400错误修复方案

核心问题排查&修复步骤

    1. 修复multer配置错误
      你当前定义了磁盘存储storage但创建multer实例时未使用,且磁盘存储不会生成req.file.buffer,要获取文件Buffer需使用内存存储:
      把原来的multer配置替换成:
    // 删掉没用的diskStorage配置,改用内存存储拿Buffer
    const multerUploader = multer({ storage: multer.memoryStorage() });
    
    同时修正调用时的变量名,你定义的变量是multerUploader,实际调用写的是upload,要统一改成对应字段,注意single的参数要和POSTMAN里上传文件的字段名完全一致:
    multerUploader.single('file')(req, res, (err) => {
    
    1. 补充uploadFile必填参数contentLength
      backblaze-b2的uploadFile方法必须传入文件大小,否则会触发400错误,在参数里添加:
    contentLength: req.file.size
    
    1. 不要硬写bucketId
      硬写的bucketId容易和实际权限不匹配,建议从getBucket的返回结果中获取:
    const bucketRes = await b2.getBucket({ bucketName: "你的实际bucket名" });
    const bucketId = bucketRes.data.buckets[0].bucketId;
    
    1. 修正fileName规则
      当前写死的fileName: "fileName"没有后缀,还可能和已有文件冲突,建议改用原文件名:
    fileName: req.file.originalname
    

修正后核心代码示例

import B2 from "backblaze-b2";
import multer from "multer";

const multerUploader = multer({ storage: multer.memoryStorage() });
const INTERNAL_SERVER_ERROR_STATUS = 500;

export const uploadCreationImage = async (req, res) => {
  try {
    const b2 = new B2({
      applicationKeyId: process.env.backblazeb2ApplicationKeyId, 
      applicationKey: process.env.backblazeb2ApplicationKey, 
    });

    await b2.authorize();
    const bucketRes = await b2.getBucket({
      bucketName: "替换为你的实际bucket名称",
    });
    const bucketId = bucketRes.data.buckets[0].bucketId;

    multerUploader.single('file')(req, res, async (err) => {
      if (err instanceof multer.MulterError || err) {
        return res.sendStatus(INTERNAL_SERVER_ERROR_STATUS);
      }

      const uploadUrlRes = await b2.getUploadUrl({ bucketId });
      const uploadRes = await b2.uploadFile({
        uploadUrl: uploadUrlRes.data.uploadUrl,
        uploadAuthToken: uploadUrlRes.data.authorizationToken,
        fileName: req.file.originalname,
        data: req.file.buffer,
        contentLength: req.file.size,
        onUploadProgress: null
      });

      console.log('上传成功', uploadRes);
      return res.send({ path: req.file.originalname });
    })
  } catch (e) {
    console.error('全局错误', e);
    return res.sendStatus(INTERNAL_SERVER_ERROR_STATUS);
  }
}

额外校验项

  • 确认POSTMAN里上传文件的字段名和multer的single()参数完全一致,比如你POSTMAN里字段名是image,那就要写multerUploader.single('image')
  • 确认你的applicationKey有对应bucket的上传权限
  • 确认bucket设置的公开/私有属性符合你的预期,权限不匹配也会触发400错误

内容的提问来源于stack exchange,提问作者Matthew Francis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:06:03