现在我正在使用Amazon S3和Paperclip,它允许我的用户上传与他们正在创建的事件相关联的图像。我的最终目标是,因为其他人可以查看此事件,以便能够点击图像并让它提示保存到他们的计算机。截至目前,单击该链接将在浏览器窗口中打开图像。我宁愿让它要求他们下载。所有图像仅保存在S3上,而不是本地。如果可能还需要隐藏暴露的s3网址或隐藏它
这是我当前的设置
的index.html
<%= link_to 'Download Creative', event.creative.url, class: "btn btn-info" %>
Event.rb
has_attached_file :creative,
:styles => { :thumb => "150x150", :custcreative => "250x75" },
:path => ":attachment/:id/:style.:extension",
:s3_domain_url => "******.s3.amazonaws.com",
:storage => :s3,
:s3_credentials => Rails.root.join("config/s3.yml"),
:bucket => '*****',
:s3_permissions => :public_read,
:s3_protocol => "http",
:convert_options => { :all => "-auto-orient" },
:encode => 'utf8'
希望有人可以帮助我。
答案 0 :(得分:27)
为避免对您的应用程序造成额外负担(在Heroku中保存dyno的时间),我宁愿做类似这样的事情:使用附件将此方法添加到您的模型中:
def download_url(style_name=:original)
creative.s3_bucket.objects[creative.s3_object(style_name).key].url_for(:read,
:secure => true,
:expires => 24*3600, # 24 hours
:response_content_disposition => "attachment; filename='#{creative_file_name}'").to_s
end
然后在你的视图/控制器中使用它:
<%= link_to 'Download Creative', event.download_url, class: "btn btn-info" %>
答案 1 :(得分:16)
为了完成这项工作,我刚刚在控制器中添加了一个新动作,所以在你的情况下它可能是:
#routes
resources :events do
member { get :download }
end
#index
<%= link_to 'Download Creative', download_event_path(event), class: "btn btn-info" %>
#events_controller
def download
data = open(event.creative_url)
send_data data.read, :type => data.content_type, :x_sendfile => true
end
编辑: 可以在此处找到下载控制器操作的正确解决方案(我已更新上面的代码):Force a link to download an MP3 rather than play it?
答案 2 :(得分:2)
现在在aws-sdk v2中,有一个方法:在Aws :: S3 :: Object中定义的presigned_url,您可以使用此方法为s3对象构建直接下载URL:
s3 = Aws::S3::Resource.new
# YOUR-OBJECT-KEY should be the relative path of the object like 'uploads/user/logo/123/pic.png'
obj = s3.bucket('YOUR-BUCKET-NAME').object('YOUR-OBJECT-KEY')
url = obj.presigned_url(:get, expires_in: 3600, response_content_disposition: "attachment; filename='FILENAME'")
然后在你的观点中,只需使用:
= link_to 'download', url
答案 3 :(得分:1)
event = Event.find(params[:id])
data = open(event.creative.url)
send_data data.read, :type => data.content_type, :x_sendfile => true, :url_based_filename => true
end
答案 4 :(得分:0)
您需要在HTTP响应标头中将“内容处置”设置为“附件”。我不是Rails开发人员 - 所以只有谷歌它你会看到很多例子 - 但它可能看起来像这样:
:content_disposition => "attachment"
或
...
:disposition => "attachment"