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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:54:02