ruby-on-rails - 如何在rails中链接单个私有(private)S3文件以供下载

标签 ruby-on-rails amazon-s3

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

我迷失在 S3 文档/参数/语法中。就像失去了几个小时。以下是非公开文件的 Amazon 网址: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::Presigner ,它允许您创建预签名 URL 来共享/下载私有(private)文件,并且您可以使该 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

关于ruby-on-rails - 如何在rails中链接单个私有(private)S3文件以供下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48479642/

相关文章:

ruby-on-rails - 带有符号的布局会产生错误

ruby-on-rails - 将类和方法调用传递给要在 Ruby 中使用的方法

ruby-on-rails - 在安装了 rvm 的 ubuntu 上成为 root 后,Ruby 回退到旧版本

amazon-web-services - 无版本控制的 AWS S3 复制

Django ManifestStaticFilesStorage 未加载正确的静态文件

ruby-on-rails - ruby install Rails 出现错误 ---无法构建 gem native 扩展。(Windows 平台)

sql - GROUP_BY 内的 Active Record LIMIT

java - 如何读取 Amazon S3 中的文件内容

python - 当 AWS-CLI 在 Python 中作为子进程运行时未指定 AWS 同步参数

java - 如何从垃圾邮件 System.out 中阻止 apache.commons.logging?