使用载波从 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 代码??)。
我正在使用 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 代码??)。