我的app目录中有一个名为“uploads”的文件夹,用户可以在其中上传文件和下载文件。我不希望uploads文件夹在公共目录中,因为我想控制下载授权。
在我的控制器中,我有:
send_file Rails.root.join('app', 'uploads', filename), :type => 'application/zip', :disposition => 'inline', :x_sendfile=>true
这实际上很好用。问题是,当我在生产服务器上,当我运行rake资产:预编译,并有一个资产目录时,该文件下载两次。该文件第一次下载时,浏览器就像没有进行任何操作一样(没有加载旋转),但我看到数据正在谷歌Chrome开发人员网络选项卡中传输。然后在下载文件后,会出现提示,询问用户是否要下载文件。
删除公共目录中的assets文件夹可以解决此问题,但我想使用资产管道。我还尝试将require_tree中的资产管道需求更改为require_directory。
有没有人知道如何使send_file与资产管道一起正常工作?
感谢。
答案 0 :(得分:8)
对于有这个问题的人,我解决了它。通过
'data-no-turbolink' => true
进入link_to助手,阻止Turbolinks搞乱下载。
答案 1 :(得分:0)
但是,如果您使用的是turbooboost = true
表单,而不是link_to,或者甚至使用link_to,您可以这样做:
在控制器内,并在操作内放置:
def download
respond_to do |format|
format.html do
data = "Hello World!"
filename = "Your_filename.docx"
send_data(data, type: 'application/docx', filename: filename)
end
format.js { render js: "window.location.href = '#{controller_download_path(params)}';" }
end
end
将controller_download_path
替换为download
操作的路径
并将post
和get
放在路线中以获取相同的路径:
post '/download' => 'your_controller#download', as: :controller_download
get '/download' => 'your_controller#download', as: :controller_download