为具有公共访问权限的文件上传生成预签名 URL

Posted

技术标签:

【中文标题】为具有公共访问权限的文件上传生成预签名 URL【英文标题】:Generate Pre signed URL for File Upload with Public Access 【发布时间】:2019-05-01 12:02:10 【问题描述】:

我有一个默认 ACL 设置为私有的存储桶。我想生成预签名的 url 并将其分发给用户,以便他们可以上传文件,并且文件需要在上传后公开访问。

我可以生成预签名的 url 并上传文件,但文件始终保持私密。如果我在创建签名 url 时将 ACL 设置为“public-read”,则 getSignedUrl() 正在生成一个签名 url,但对该签名 url 的 PUT 请求会引发访问被拒绝。

var params = 
    Bucket: "bucket name",
    Key: "file key name",
    Expires: 3600,
    ACL:"public-read",
    ContentType: "application/octet-stream"
;
s3.getSignedUrl("putObject", params);

存储桶可以包含私有或可公开访问的文件,我想在创建签名 URL 时设置隐私。我怎样才能做到这一点?

我正在使用亚马逊 javascript sdk。

【问题讨论】:

【参考方案1】:

你可以使用createPresignedPost函数

s3.createPresignedPost(
    Bucket: someBucket,
    Expires: expireSeconds,
    Fields: 
      ACL:  'public-read',
      Key: fileName,
      'Content-Type': fileType,
    
  );

【讨论】:

【参考方案2】:

来自 AWS-S3 文档...

看起来你必须努力做到这一点。

getSignedUrl(operation, params, callback) ⇒ String?
Note: You must ensure that you have static or previously resolved credentials if you
call this method synchronously (with no callback), otherwise it may not properly sign
the request. If you cannot guarantee this (you are using an asynchronous credential provider,
i.e., EC2 IAM roles), you should always call this method with an asynchronous callback.
Note: Not all operation parameters are supported when using pre-signed URLs. Certain parameters,
such as SSECustomerKey, ACL, Expires, ContentLength, or Tagging must be provided as headers when
sending a request.
If you are using pre-signed URLs to upload from a browser and need to use these fields,
see createPresignedPost()....

【讨论】:

以上是关于为具有公共访问权限的文件上传生成预签名 URL的主要内容,如果未能解决你的问题,请参考以下文章

使用预签名 URL 将文件上传到 Amazon S3 时出现 CORS 错误

Amazon s3:“阻止公共访问”设置以允许使用签名 URL 进行公共读取私有写入

为 Azure Blob 生成预签名 URL 引发空指针异常

如何将文件上传到 AWS 中的预签名 URL?

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问