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

xesrikrc  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(169)

指的是: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}?
有其他解决办法吗?

nkoocmlb

nkoocmlb1#

首先,您提供的链接是Ruby v1的SDK,它非常过时。我会推荐v3 docs代替。正如您将看到的,这些文档建议您不需要自己构建PresignedPost,而应该首先尝试Bucket#presigned_post和Object#presigned_post。
当您创建预签名URL的请求时,只需使用所需的密钥即可。例如,如果用户上传bar/foo.png,Ruby代码将为名为bar/1234.png的新对象创建一个预签名的URL。我建议使用uuid、timestamp或类似的东西来代替1234,以确保对象名是唯一的,不会互相覆盖。
例如:

# 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
)

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

相关问题