【问题标题】:Triggering download of S3 file with presigned_url使用 presigned_url 触发 S3 文件的下载
【发布时间】:2017-04-04 12:54:42
【问题描述】:

我正在尝试通过我的 rails 应用程序访问我的 S3 服务器上的文件。目前,该应用程序能够通过 aws-sdk v2 gem 创建一个presigned_url,然后重定向以显示该文件(我主要使用图像作为文件)。这一切都很好,但不是简单地在浏览器中显示文件,我真的很想触发该文件的自动下载。

就重定向而言,我的代码如下:

def get
    asset = current_user.assets.find_by_id(params[:id])

    if asset
        s3 = Aws::S3::Resource.new
        bucketlink = s3.bucket(ENV['S3_BUCKET_NAME']).object(asset.uploaded_file.path).presigned_url(:get, expires_in: 3600)
        redirect_to bucketlink
    else
        flash[:error]="Don't be cheeky!  Mind your own assets"
        redirect_to assets_path
    end
end

谁能告诉我如何触发该文件的下载?非常感谢。

【问题讨论】:

    标签: ruby-on-rails amazon-web-services amazon-s3 aws-sdk


    【解决方案1】:

    我对 ruby​​ 一无所知,所以这是一个猜测。但基于我直接使用 REST API 的专业知识和我想到的特定字符串的 quick search of the SDK docs,我认为您正在寻找像这样:

    bucketlink = s3.bucket(ENV['S3_BUCKET_NAME']).object(asset.uploaded_file.path).presigned_url(:get, expires_in: 3600, response_content_disposition: 'attachment; filename=myfile.jpg')
    

    &response-content-disposition=value 出现在经过身份验证的GET 请求的查询字符串中时,S3 将该值作为响应中的Content-Disposition: 标头返回。 “附件”表示“下载,不显示”,文件名是浏览器通常使用的文件名,或者如果显示“另存为”提示,则作为默认文件名提供......所以用户下载的文件名可以不同比存储在 S3 中的文件名。 'attachment;<space>filename=<target-filename>' 是一个字符串,您需要构建它以包含一些合理的内容,而不是“myfile.jpg”。

    【讨论】:

    • 哇,我印象深刻。非常感谢。
    • 对于下一个出现的人,我最终不需要文件名,所以我最终使用了以下文件名:bucketlink = s3.bucket(ENV['S3_BUCKET_NAME']).object(asset.uploaded_file.path).presigned_url(:get, expires_in: 3600, response_content_disposition: 'attachment')
    • @neanderslob 我正在尝试做这件事,但遇到了无限循环问题outlined here。你遇到过这个吗?你如何调用你的 get 方法?
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2021-11-28
    • 2016-09-23
    • 2019-05-19
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多