关于node.js:S3.getSignedUrl接受多个内容类型

S3.getSignedUrl to accept multiple content-type

我正在使用react-s3-uploader节点程序包,该程序包使用signingUrl以获得用于将对象存储到S3中的signedUrl。

当前,我已经配置了一个lambda函数(带有API Gateway端点)来生成此signedUrl。经过一番修补后,我已经开始使用它了,但是注意到我必须在我的lambda函数中定义content-type,它看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var AWS = require('aws-sdk');
const S3 = new AWS.S3()
AWS.config.update({
  region: 'us-west-2'
})

exports.handler = function(event, context) {
  console.log('context, ', context)
  console.log('event, ', event)
  var params = {
    Bucket: 'video-bucket',
    Key: 'videoname.mp4',
    Expires: 120,
    ACL: 'public-read',
    ContentType:'video/mp4'
  };
  S3.getSignedUrl('putObject', params, function (err, url) {
    console.log('The URL is', url);
    context.done(null, {signedUrl: url})
  });  
}

问题是我希望此签名的url能够接受多种类型的视频文件,并且我尝试将ContentType设置为video/*,这是行不通的。另外,由于此lambda端点实际上并不是进行上传的对象,因此我无法事先将文件类型传递给此函数。


您将必须找到一种发现文件类型并将其作为参数传递给Lambda函数的方法。这里没有其他选择,它带有预签名的PUT

PUT的请求签名过程没有提供通配符或多个/替代值。


万一其他人正在寻找有效的答案,我最终发现react-s3-uploader确实将内容类型和文件名传递给getSignin url(除非我之前忘记了通过API Gateway传递查询) ,因此我能够将其提取为lambda中的event.params.querystring.contentType

然后在参数中,我简单地设置了{ContentType: event.params.querystring.contentType},现在它接受所有文件格式。