如何使用 AWS S3 预签名帖子指定带扩展名的文件名?

Jef*_*rto 5 javascript ruby amazon-s3 amazon-web-services

指的是:http : //docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/PresignedPost.html

当用户从浏览器直接上传到 S3 时。您可以指定用户必须将资源发布到的 URL。

您还可以使用 ${filename} 来获得基于相关对象文件名的路径。

但是,我们只需要文件类型而不是全名,因为我们需要资源上的可预测位置。

例如,在用户上传名为 mypic.png 的文件后,我们希望 url 为 /folder/1234.png 而不是 /folder/mypic.png。

需要明确的是,如果我们指定 /folder/1234 则 png 扩展名将丢失。文件类型可以是任何图像。

由于我们不知道文件扩展名,因此似乎唯一的方法是通过 ${filename}

是否有其他类型的模板类型变量,如 ${filetype}?

还有其他解决方案吗?

for*_*aws 2

首先,您提供的链接是SDK for Ruby v1,它已经非常过时了。我会推荐v3 文档。正如您将看到的,这些文档建议您不需要自己构建 PresignedPost,而应该首先尝试Bucket#presigned_postObject#presigned_post

当您创建预签名 URL 的请求时,只需使用您所需的密钥即可。例如,如果用户上传bar/foo.png,您的 Ruby 代码将为名为 的新对象创建一个预签名 URL bar/1234.png。我建议1234使用 uuid、时间戳或等效项来确保对象名称是唯一的并且不会相互覆盖。

例如:

# Assuming you already have an S3 client instance configured
s3 = Aws::S3::Resource.new(region: "us-east-1")
s3_bucket_name = 'foo'
s3_bucket = s3.bucket(s3_bucket_name)
file_name = 'bar/foo.png'
new_key = create_new_key(file_name)
presigned_post = s3_bucket.presigned_post(
  key: new_key
)
Run Code Online (Sandbox Code Playgroud)

create_new_key()您可以将操作原始文件路径的字符串所需的逻辑放入所需的键中。我建议使用 Ruby 的File内置函数来最有效地完成此任务。