如何在 Rails 中链接单个私有 S3 文件以供下载



我想为用户提供一个链接,以便在我的 rails 应用程序中从 Amazon S3 下载非公共文件。这不是用户上传的文件,只是我上传的单个文件,任何登录的人都应该能够下载。

我迷失在 S3 文档/参数/语法中。就像失去的时间一样。这是非公开文件的亚马逊网址:https://s3-us-west-1.amazonaws.com/physicianneedtool/static/Historical_Payer_Profile.xlsx。S3_BUCKET、S3_KEY、S3_SECRET_KEY和S3_REGION变量已经与我在应用程序中的载波设置一起使用,所以我知道它们很好。

我当前的非工作代码:

s3 = Aws::S3::Resource.new(region: ENV["S3_REGION"], 
access_key_id: ENV["S3_KEY"], 
secret_access_key: ENV["S3_SECRET_KEY"])
@file_url = s3.bucket(ENV["S3_BUCKET"])
.object('Historical_Payer_Profile.xlsx')
.get(response_target: 'static/Historical_Payer_Profile.xlsx')

我得到的错误是Aws::S3::Errors::NoSuchKey。在 rails 控制台中,我发现 s3.bucket(ENV["S3_BUCKET"]).object('Historical_Payer_Profile.xlsx') 返回一个看似有效的 S3 对象,因此看起来错误是由最后的 .get 调用引起的。我在那里做错了什么?为 response_target 指定的路径是我从 S3 控制台中的复制路径按钮获得的确切路径。

您可以使用Aws::S3::P resigner,它允许您创建预签名 URL 来共享/下载私有文件,并且您可以使此 URL 在一段时间后过期。

presigner = Aws::S3::Presigner.new
presigner.presigned_url(
:get_object,
bucket: ENV['S3_BUCKET'],
key: ENV['S3_KEY'],
expires_in: 1.day.to_i
).to_s

最新更新