【问题标题】:how to link a single private S3 file in rails for download如何在 Rails 中链接单个私有 S3 文件以供下载
【发布时间】:2019-05-11 00:05:44
【问题描述】:

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

【问题讨论】:

  • .object(file name should be here) 你的情况下 .object('Historical_Payer_Profile.xlsx')
  • 感谢@AjayBarot。我更新了代码(如上面的问题所示),但仍然出现 nosuchkey 错误。有任何想法吗?响应目标值是我在 s3 控制台中对文件使用“复制路径”功能时得到的确切字符串。
  • 我什至用文字区域/键/桶字符串替换了 ENV 变量,只是为了消除 ENV 变量存在问题的任何可能性。
  • 我想通了,可能很快就会发布我自己的问题的答案。 @AjayBarot 顺便说一句,包含完整路径所需的密钥,所以它是 'static/Historical_Payer_Profile.xlsx'

标签: ruby-on-rails amazon-s3


【解决方案1】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多