使用carrierwave从S3下载图像(不打开)

时间:2018-02-17 01:27:19

标签: ruby-on-rails ruby amazon-s3 download carrierwave

我正在使用Carrierwave将我的图像上传到S3,工作正常。我希望用户点击“下载”链接,该链接将自动从S3下载图像。

目前有效:

media.html.erb

<%= link_to download_media_partnership_path(@partner, m: m.id), target: '_self', data: {disable_with: "<i class='fa fa-spinner fa-spin media-icon'></i>"} 
    <i class="fa fa-download media-icon download" id=""></i>
<% end %>

partnership_controller.rb

def download_media
  @media = TeamMedia.find(params[:m])
  file_data = open(@media.attachment.url)
  send_data file_data.read, filename: "#{@media.name}", type: @media.attachment.content_type, disposition: 'attachment'
end

team_media.rb

mount_uploader :attachment, TeamMediaUploader

问题是open(@media.attachment.url)导致应用程序在发送给用户之前先下载文件。用户将下载视频,因此在获得“下载”弹出窗口之前需要很长时间。

任何方式我都可以编辑上面的工作,就像this answer一样,所以我的应用程序不必先下载?我无法使用Carrierwave凭据。或者替代解决方案。

2 个答案:

答案 0 :(得分:2)

我建议您使用JavaScript下载任何数据(文件/图像)。

您可以对服务器进行ajax调用以获取网址。

#removed: target: '_self' no need it anymore
#added: remote: true
<%= link_to download_media_partnership_path(@partner, m: m.id), remote: true, data: {disable_with: "<i class='fa fa-spinner fa-spin media-icon'></i>"} 
    <i class="fa fa-download media-icon download" id=""></i>
<% end %>


def download_media
  @media = TeamMedia.find(params[:m])
  @url = @media.attachment.url

  respond_to do |format|
    format.js {}
  end
end

Check this Link并在您的javascript资源中实施。

不要忘记创建download_media.js.erb文件。

#download_media.js.erb

downloadFile("<%= @url %>");

答案 1 :(得分:0)

我只是直接在S3上链接到源文件,而不是通过我的Rails应用程序进行代理。

url

Carrierwave link_to方法应该返回URL来检索远程存储上的对象,而link_to不仅仅是路由,而是字符串 - 在这种情况下,字符串是另一个URL

如果你想强迫用户下载,而不仅仅是渲染文件,你可以使用HTML5 download attribute(在这种情况下我甚至可能放弃使用{ "auth_url": "https://identity.open.softlayer.com", "project": "object_storage_xxxxxxxx_xxxx_xxxx_b35a_6d007e3f9118", "projectId": "512xxxxxxxxxxxxxxxxxxxxxe00fe4e1", "region": "dallas", "userId": "e8c19efxxxxxxxxxxxxxxxxxxx91d53e", "username": "admin_1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa66", "password": "fTxxxxxxxxxxw8}l", "domainId": "15xxxxxxxxxxxxxxxxxxxxxxxxxxxx2a", "domainName": "77xxx3", "role": "admin" } 帮助器,只需构建手工HTML链接代码??)。