使用Node.js+Express.js上传文件至Azure Blob Storage时遇错误
问题分析与解决方案
核心问题
你的代码直接将multer返回的整个文件对象传给了blockBlobClient.upload方法,但该方法仅接受文件原始数据(Buffer或可读流),而非包含元数据的完整对象,这是上传失败的主要原因。此外代码还有几处细节需要修正。
修正后的代码
const addProductImage = async (req: any, res: Response) => { try { console.log(req.files.file); // 完善文件存在性检查,添加return避免后续代码执行 if (!req.files || !req.files.file) { return res.status(400).send({ status: Status.ERROR, error: "No file uploaded" }); } const file = req.files.file; const sharedKeyCred = new StorageSharedKeyCredential(accName, acckey); const blobServClient1 = new BlobServiceClient(`https://${accName}.blob.core.windows.net`, sharedKeyCred); const containerClient1 = blobServClient1.getContainerClient(containerName); const blockBlobClient = containerClient1.getBlockBlobClient(file.name); // 使用文件的Buffer数据(file.data)上传,而非整个file对象 await blockBlobClient.upload(file.data, file.size, { blobHTTPHeaders: { blobContentType: file.mimetype // 正确设置文件MIME类型 } }); res.status(200).send({ status: Status.SUCCESS }); } catch (error: any) { // 返回具体错误信息,便于排查 res.status(500).send({ status: Status.ERROR, error: error.message || "Upload failed" }); } }
关键修正点
- 上传数据修正:将
await blockBlobClient.upload(file, file.size)改为await blockBlobClient.upload(file.data, file.size),file.data是文件的Buffer数据,符合Azure Blob上传方法的参数要求。 - 完善文件检查逻辑:同时校验
req.files和req.files.file是否存在,并添加return终止后续代码执行,避免无意义的错误。 - 设置Blob内容类型:通过
blobHTTPHeaders配置文件的MIME类型,确保存储的Blob有正确的内容标识。 - 优化错误反馈:捕获错误时返回
error.message而非整个错误对象,更直观地展示问题原因。
Postman请求验证要点
确保Postman请求配置正确:
- 请求方法:POST
- 请求体类型:form-data
- 键名:
file(需与代码中req.files.file的键名完全一致) - 值类型选择:File,再选择本地的图片/视频文件
内容的提问来源于stack exchange,提问作者Abhishek Konnur
相关产品推荐
相关产品推荐

