Node.js上传图片到Backblaze B2调用b2.uploadFile返回400错误如何解决?
400错误修复方案
核心问题排查&修复步骤
- 修复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) => {- 修复multer配置错误
- 补充
uploadFile必填参数contentLength
backblaze-b2的uploadFile方法必须传入文件大小,否则会触发400错误,在参数里添加:
contentLength: req.file.size- 补充
- 不要硬写bucketId
硬写的bucketId容易和实际权限不匹配,建议从getBucket的返回结果中获取:
const bucketRes = await b2.getBucket({ bucketName: "你的实际bucket名" }); const bucketId = bucketRes.data.buckets[0].bucketId;- 不要硬写bucketId
- 修正fileName规则
当前写死的fileName: "fileName"没有后缀,还可能和已有文件冲突,建议改用原文件名:
fileName: req.file.originalname- 修正fileName规则
修正后核心代码示例
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
相关产品推荐
相关产品推荐

