Ruby on Rails AWS S3下载URL

时间:2016-02-07 20:05:51

标签: ruby-on-rails amazon-s3

如何为用户创建网址链接,以便在用户点击链接时强制他们下载AWS S3对象?

我已经看到了这两个解决方案:Using send_file to download a file from Amazon S3?Using send_file to download a file from Amazon S3?但是,它们似乎引用了旧的AWS S3 v1 SDK,并且v2 AWS S3 SDK中似乎没有url_for。

感谢。

2 个答案:

答案 0 :(得分:3)

使用以下代码段结束解决。希望这有助于其他人。

presigner = Aws::S3::Presigner.new
    url = presigner.presigned_url(:get_object, #method
                    bucket: ENV['S3_BUCKET'], #name of the bucket
                    key: s3_key, #key name
                    expires_in: 7.days.to_i, #time should be in seconds
                    response_content_disposition: "attachment; filename=\"#{filename}\""
                    ).to_s

答案 1 :(得分:0)

这是我得到的:

def user_download_url(s3_filename, download_filename=nil)
  s3_filename = s3_filename.to_s # converts pathnames to string
  download_filename ||= s3_filename.split('/').last
  url_options = {
    expires_in:                   60.minutes,
    response_content_disposition: "attachment; filename=\"#{download_filename}\""
  }
  object = bucket.object(s3_filename)
  object.exists? ? object.presigned_url(:get, url_options).to_s : nil
end

def bucket
  @bucket ||= Aws::S3::Resource.new(region: ENV['AWS_REGION']).bucket(ENV['AWS_S3_BUCKET'])
end

要创建下载链接,只需将redirect_to user_download_url(s3_file_path)置于控制器操作中,然后创建指向该控制器操作的链接。