文件使用无服务器 api 成功上传到 s3,但未打开(已损坏)

Posted

技术标签:

【中文标题】文件使用无服务器 api 成功上传到 s3,但未打开(已损坏)【英文标题】:File uploaded successfully to s3 using serverless api but it doesn't open(corrupted) 【发布时间】:2020-07-17 22:21:33 【问题描述】:

我有以下 ts 代码将来自 GraphQL API 的文件提交到我的 AWS S3 存储桶。 当我使用 nodejs http lib 运行项目时,它可以完美运行,但是当我使用 sls offline start 或从 aws lambda 函数运行它时,它会上传文件但无法打开(如损坏的文件) - 文本文件除外.

代码:

const fileStream = data.createReadStream()
const uploadParams = 
                Bucket: 'XXX',
                Key: data.filename,
                Body: fileStream,
                ContentType: data.mimetype,
                ContentEncoding: data.encoding,
                ACL: 'public-read',
;
const result = await s3.upload(uploadParams).promise()

数据对象如下所示:

 filename: '11083626_830419647032756_2338667058698516671_n.jpg',
  mimetype: 'image/jpeg',
  encoding: '7bit',
  createReadStream: [Function: createReadStream] 

我尝试将 createReadStream 转换为缓冲区并改用 s3.putObject() 函数,但仍然无法正常工作。

添加了以下配置以允许serverless.yml 中的二进制文件但仍然存在相同的问题:

provider:
    apiGateway:
        binaryMediaTypes:
            - '*/*'

【问题讨论】:

【参考方案1】:

添加后:

provider:
    apiGateway:
        binaryMediaTypes:
            - '*/*'
或者在我的例子中只使用 'multipart/form-data' 而不是 '/'

它在 deploy 之后在 lambda AWS 中工作,但使用 sls offline start 仍然无法离线工作,这可能是他们代码中的错误,或者我应该添加额外的东西让它离线工作

【讨论】:

以上是关于文件使用无服务器 api 成功上传到 s3,但未打开(已损坏)的主要内容,如果未能解决你的问题,请参考以下文章

从上传到 S3 的文件触发的无服务器框架和 AWS Step Functions(AWS 状态机)

使用 Alamofire 将文件上传到 amazon s3

使用预签名 URL 上传到 S3 存储桶会出现 403 禁止错误

上传到 S3 时如何解决 403 Forbidden 错误

仅有时解析服务器 S3 图像上传 - 套接字问题

直接从服务器将 csv 文件上传到 aws s3 存储桶