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

部署到AWS Lambda后图片上传无法显示问题求助

问题描述

本地运行代码时,上传至AWS S3的图片可通过浏览器链接正常显示;但将代码部署到AWS Lambda后,上传的图片无法显示。已添加S3相关IAM权限但问题仍未解决。

上传函数代码(Go)
func UploadFile(uploader *manager.Uploader, key string, file multipart.File, fileHeader *multipart.FileHeader) (string, error) {

    if file == nil {
        return "", errors.New("file is nil")
    }

    contentType := fileHeader.Header.Get("Content-Type")
    if contentType == "" {
        contentType = "application/octet-stream" // Default to binary if content type is not provided
    }

    fileStat, err := fileHeader.Open()
    if err != nil {
        return "", fmt.Errorf("failed to open file for debugging: %w", err)
    }
    defer fileStat.Close()

    if _, err := file.Seek(0, 0); err != nil {
        return "", errors.New("failed to reset file cursor: " + err.Error())
    }

    result, err := uploader.Upload(context.TODO(), &s3.PutObjectInput{
        Bucket:      aws.String("unleap-bucket"),
        Key:         aws.String("uneleap/" + key),
        Body:        file,
        ContentType: aws.String(contentType),
        ACL:         types.ObjectCannedACLPublicRead,
    })

    if err != nil {
        return "", err
    }
    // Ensure the result is not nil and return the location of the uploaded file
    if result == nil || result.Location == "" {
        return "", errors.New("failed to get the uploaded file location")
    }
    return result.Location, err
}
Serverless配置文件
service: uneleap-api-client

frameworkVersion: ">=4.1.19"


provider:
  name: aws
  region: eu-north-1
  runtime: go1.x
  stage: ${opt:stage}
  iam:
    role:
      statements:
        - Effect: "Allow"
          Action:
            - "s3:PutObject"
            - "s3:GetObject"
            - "s3:PutObjectAcl"
          Resource: "arn:aws:s3:::u-bucket/*"

custom:
  hooks:
    'package:initialize': ./scripts/generate_swagger.sh

package:
  patterns:
    - '!*/**'
    - bin/main

functions:
  api:
    handler: bin/main
    events:
      - http:
          path: /{proxy+}
          method: ANY
          cors: true
已配置的IAM权限
iam:
        role:
          statements:
            - Effect: "Allow"
              Action:
                - "s3:PutObject"
                - "s3:GetObject"
                - "s3:PutObjectAcl"
              Resource: "arn:aws:s3:::u-bucket/*"
排查关键点
  • Bucket名称不匹配:代码中指定的Bucket是unleap-bucket,但IAM权限配置的Resource是u-bucket,两者不一致,导致权限无法覆盖实际使用的Bucket,这是核心问题之一。
  • 文件指针重置有效性:代码中打开了fileStat但未使用,反而对file执行Seek(0,0),需确认file的指针位置是否正确,若上传前文件指针已到末尾,会导致上传空文件。
  • S3 Bucket公开访问限制:检查Bucket的「Block Public Access」设置,若开启了阻止公开访问,即使设置PublicRead ACL也无法让对象公开可访问。
  • IAM权限范围修正:将IAM角色的Resource修改为arn:aws:s3:::unleap-bucket/*,确保权限覆盖实际使用的Bucket及对象路径。
  • 上传内容完整性验证:查看Lambda日志,对比本地和Lambda环境下上传的文件大小,确认是否完整上传。
  • Content-Type正确性检查:验证Lambda环境下是否正确获取到文件的Content-Type,若Content-Type错误(如默认成application/octet-stream),浏览器可能无法正确解析图片。

内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:22:25