Node.js使用aws-sdk上传文件到S3后大小异常减小如何解决
问题根因
你代码的核心错误是没有正确使用文件读取结果:fs.readFile 的回调函数第二个参数 data 已经是读取到的文件二进制内容,但你没有使用该参数,反而将传入的file变量(也就是文件路径/文件名)转成Buffer作为上传的Body参数,因此最终上传到S3的内容就是文件名本身,文件大小自然和文件名长度一致,这就是你看到的上传后只有7B的原因。
修正后的代码
const fs = require('fs'); // 初始化s3的逻辑保持不变 function read(file, numFiles) { fs.readFile(file, function (err, data) { // 读取出错时直接返回,避免后续逻辑执行 if (err) { console.log('文件读取失败:', err); return; } s3.putObject( { Bucket: "sample-bucket", Key: file, Body: data, // 直接使用readFile返回的文件内容 // 可选:补充设置正确的Content-Type,避免S3识别错误 ContentType: "application/xml" // .dzi本质是XML格式,也可以根据实际文件类型调整 }, // 回调第一个参数是错误对象,第二个才是响应 function (err, resp) { if (err) { console.log('上传失败:', err); return; } console.log("Successfully uploaded, ", file); uploadCount++; console.log("uploadcount is:", uploadCount); if (uploadCount == numFiles) { res.send("All files uploaded"); } } ).on("httpUploadProgress", (evt) => { console.log(`Uploaded ${evt.loaded} out of ${evt.total}`); }); }); }
额外优化建议
- 原代码缺少上传错误捕获逻辑,
putObject的回调第一个参数为错误对象,原代码只接收了第二个响应参数,会漏掉上传错误的情况 - 如果要上传大量文件,建议使用aws-sdk的promise版本API配合
Promise.all或者异步并发控制工具,避免回调嵌套和并发过高导致的问题 - 针对.dzi格式的关联切片文件,建议批量上传时统一设置对应MIME类型,避免后续通过S3访问资源时出现解析异常
内容的提问来源于stack exchange,提问作者user11531820
相关产品推荐
相关产品推荐

