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

Downloading an image from S3 using carrierwave (without open)

我正在使用 Carrierwave 将图像上传到 S3,效果很好。我希望用户单击 'Download' link 将自动从 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) 导致应用程序在发送给用户之前先下载文件。用户将下载视频,因此需要很长时间才能看到 'download' 弹出窗口。

我是否可以通过任何方式编辑以上内容以使其像 this answer 一样工作,这样我的应用程序就不必先下载了?我无法让它与 Carrierwave 凭据一起使用。或替代解决方案。

我建议您使用 JavaScript 下载数据 (file/image) 任何东西。

您可以 ajax 调用服务器以获得 url。

#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 %>");

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

<%= link_to @partner.media.url, "Download" %>

Carrierwave url 方法应该 return URL 来检索远程存储上的对象,并且 link_to 不仅获取路由,还获取字符串- 在这种情况下字符串到另一个 URL.

如果你想强制用户下载,而不仅仅是渲染文件,你可以使用 HTML5 download attribute(在这种情况下我什至可能会完全放弃使用 link_to 助手,只是手动构建 HTML link 代码??)。