我正在使用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凭据。或者替代解决方案。
答案 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链接代码??)。