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

AWS Lambda(Node.js Express+Multer)上传S3仅显示空白小方块问题

Lambda+Express+Multer上传S3后图片显示空白方块

我用Node.js Express开发的AWS Lambda服务,通过Multer处理文件上传到S3存储桶,但上传后的图片在S3里显示为空白小方块。试过把文件Buffer转成Base64上传,问题依旧;但本地localhost运行API时,上传的图片能正常显示。

相关代码

Multer中间件配置

// multer middleware
const multer = require("multer");
const helpers = require("../helpers/image-upload-helper");
const storage = multer.memoryStorage();

let upload = multer({
   storage: storage,
   fileFilter: helpers.imageFilter,
}).any();

控制器上传逻辑

// controller
try {
    if(req.files){
      for (const file of req.files) {
        const ImageName = randomImageNameGenerator.randomImageName()
        const params = {
            Bucket: process.env.BUCKET_NAME,
            Key: ImageName,
            Body: file.buffer, 
            ContentType : file.mimetype,
        }
        const command = new PutObjectCommand(params)
        const myData = await s3.send(command)
      }
    }

命令日志与返回结果

PutObjectCommand日志

PutObjectCommand {
  middlewareStack: {
    add: [Function: add],
    addRelativeTo: [Function: addRelativeTo],
    clone: [Function: clone],
    use: [Function: use],
    remove: [Function: remove],
    removeByTag: [Function: removeByTag],
    concat: [Function: concat],
    applyToStack: [Function: cloneTo],
    identify: [Function: identify],
    resolve: [Function: resolve]
  },
  input: {
    Bucket: 'my-bucket',
    Key: 'b4651myrandomkey8efab90aba02e53767f247f231cfb7ee431e34877bf21ab1bd655b3789',
    Body: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 f8 00 00 00 f5 08 06 00 00 00 bc c1 e7 15 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 20 00 ... 10640 more bytes>,
    ContentType: 'image/png'
  }
}

S3上传返回结果

{
  '$metadata': {
    httpStatusCode: 200,
    requestId: '6C1EM009PP420NRK',
    extendedRequestId: 'ZfGR4AR4mElYOSGes68YqEegptyO5PY5iPCvplP89wr1nqT4DZHwo0D0bl5qyZ7aAB0HaDaTAKU=',
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
  ETag: '"96425366df243451e35a941524b2a019a6ad2b"',
  ServerSideEncryption: 'ABDS256',
  VersionId: 'rpgj.L5AwGNCcKVzatIY5zHf_SYVNWt0'
}

注:CloudWatch中未发现任何错误日志,上传后的图片为无法正常渲染的空白占位方块。


解决方案

1. 检查API网关的内容处理配置

如果使用API Gateway代理Lambda,网关可能会篡改请求体:

  • 进入API Gateway控制台,找到目标API的集成请求设置
  • 把“内容处理”选项设为**“通过”**(Pass through),避免网关自动对二进制数据做编码/解码处理

2. 对比本地与Lambda的文件Buffer长度

在上传前打印文件Buffer的长度,确认Lambda收到的是完整文件:

// 本地测试时记录这个长度,和Lambda中的对比
console.log(`Lambda中文件Buffer长度: ${file.buffer.length}`);

如果长度不一致,说明API网关限制了请求体大小,或者Multer没有正确读取完整文件。

3. 完善S3上传参数

给PutObject添加ContentLength参数,确保S3能识别文件的正确大小:

const params = {
    Bucket: process.env.BUCKET_NAME,
    Key: ImageName,
    Body: file.buffer, 
    ContentType : file.mimetype,
    ContentLength: file.size, // 新增,传递文件原始大小
}

4. 验证Lambda的IAM权限

确认Lambda的IAM角色拥有s3:PutObject权限,且资源范围包含目标Bucket(比如arn:aws:s3:::my-bucket/*),虽然返回200,但权限不足可能导致文件不完整。

5. 单独测试S3上传逻辑

把上传S3的代码抽离出来,用serverless-offline模拟Lambda环境测试,排除Express和Multer的干扰,确认S3上传本身没有问题。

内容的提问来源于stack exchange,提问作者Frozen Elsa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:40:25