【问题标题】:Downloading an image from S3 using carrierwave (without open)使用载波从 S3 下载图像(未打开)
【发布时间】:2018-07-27 23:16:08
【问题描述】:

我正在使用 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 凭据一起使用。或替代解决方案。

【问题讨论】:

  • 你想通过浏览器下载?
  • @ErvalhouS 您会注意到它略有不同。我确实在我的问题的链接中引用了该问题。我需要能够做到这一点 qith Carrierwave
  • @7urkm3n 是的,无需自己从 S3 下载媒体

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


【解决方案1】:

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

您可以对服务器进行 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 %>");

【讨论】:

  • 这似乎并没有真正下载它。它只是呈现一个新选项卡,其 URL 设置为@url。它和我写 link_to @media.attachment.url 的效果一样
  • @MikeHolford 你检查链接了吗?此外,你不必获得新标签。
  • 实际上效果很好。 Remote:true 的良好体验,它导致我的 disable_with 重新启用。谢谢
  • @MikeHolford 很高兴这有帮助,也不要忘记删除有关 disable_with to re-enable 的其他帖子
【解决方案2】:

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

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

Carrierwave url 方法应返回 URL 以检索远程存储上的对象,link_to 不仅采用路由,还采用字符串 - 在本例中为另一个 URL 的字符串。

如果您想强制用户下载,而不仅仅是渲染文件,您可以使用HTML5 download attribute(在这种情况下,我什至可能完全放弃使用link_to 帮助程序,只需通过以下方式构建 HTML 链接代码手??)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多