Rails 4,资产管道导致用户可下载文件被下载两次

时间:2013-07-06 20:29:14

标签: ruby-on-rails ruby-on-rails-4 sendfile

我的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与资产管道一起正常工作?

感谢。

2 个答案:

答案 0 :(得分:8)

对于有这个问题的人,我解决了它。通过

'data-no-turbolink' => true 

进入link_to助手,阻止Turbolinks搞乱下载。

https://github.com/rails/turbolinks/issues/182

答案 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操作的路径

并将postget放在路线中以获取相同的路径:

post '/download'  => 'your_controller#download',  as: :controller_download
get '/download'  => 'your_controller#download',  as: :controller_download