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

时间:2018-01-27 19:22:43

标签: ruby-on-rails amazon-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变量已经可以在应用程序中使用我的carrierwave设置,所以我知道它们很好。

我目前的非工作代码:

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控制台中的复制路径按钮获得的确切路径。

1 个答案:

答案 0 :(得分:0)

您可以使用Aws::S3::Presigner,它允许您创建预签名的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