【问题标题】:Multiple file type uploads to S3 using single Lambda function使用单个 Lambda 函数将多种文件类型上传到 S3
【发布时间】:2021-03-28 18:20:04
【问题描述】:

我希望用户能够将 JPG 或 PNG 图像上传到 S3 存储桶。

我正在使用 Lambda 函数,它只允许我为 S3 预签名 .jpg 图像,并且它仅适用于一种文件类型。如何添加其他文件类型来预签名,例如 .png 图像。我真的需要编写一个新的 Lambda,只需将 .jpg 更改为 .png,或者我可以在下面的现有代码中以某种方式完成吗?

const AWS = require('aws-sdk')
AWS.config.update({ region: process.env.REGION })
const s3 = new AWS.S3();

const uploadBucket = 'xxx-bucket'

exports.handler = async (event) => {
  const result = await getUploadURL()
  console.log('Result: ', result)
  return result
};

const getUploadURL = async function() {
  console.log('getUploadURL started')
  let actionId = Date.now()

  var s3Params = {
    Bucket: uploadBucket,
    Key:  `${actionId}.jpg`,
    ContentType: 'image/jpeg',
    CacheControl: 'max-age=31104000',
    ACL: 'public-read',
  };

  return new Promise((resolve, reject) => {
    // Get signed URL
    let uploadURL = s3.getSignedUrl('putObject', s3Params)
    resolve({
      "statusCode": 200,
      "isBase64Encoded": false,
      "headers": {
        "Access-Control-Allow-Origin": "*"
      },
      "body": JSON.stringify({
          "uploadURL": uploadURL,
          "photoFilename": `${actionId}.jpg`
      })
    })
  })
}

【问题讨论】:

  • s3Params 中的项目将强制上传,因为它们是签名部分的一部分。因此,请尝试删除 Key: '${actionId}.jpg'ContentType: 'image/jpeg'。这应该允许上传任何内容。

标签: amazon-web-services amazon-s3 aws-lambda serverless


【解决方案1】:

您的选择如下:

  • 按照您的建议制作一个新的 Lambda 以单独处理 PNG
  • 通过您的事件将参数传递给您的getUploadURL 函数,例如:
exports.handler = async event => {
  const { filetype } = event.body (or pathParams, query string, etc)
  const result = await getUploadURL(filetype)
  console.log('Result: ', result)
  return result
};

const getUploadURL = async filetype => {
  console.log('getUploadURL started')
  let actionId = Date.now()

  var s3Params = {
    Bucket: uploadBucket,
    Key:  `${actionId}.${filetype}`,
    ContentType: `image/${filetype === 'jpg'?'jpeg':'png'}`,
    CacheControl: 'max-age=31104000',
    ACL: 'public-read',
  };

...

对 S3.getSignedUrl() 的调用至少需要 {Bucket: 'bucket', Key: 'key'} 才能进行 putObject 操作。因此,如果您不想牺牲文件扩展名和/或内容类型属性,那么这些是唯一的选择。

AWS docs

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 2021-08-22
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多