3

我的应用程序目录中有一个名为“uploads”的文件夹,用户可以在其中上传文件和下载文件。我不希望上传文件夹位于公共目录中,因为我想控制下载授权。

在我的控制器中,我有:

send_file Rails.root.join('app', 'uploads', filename), :type => 'application/zip', :disposition => 'inline', :x_sendfile=>true

这实际上工作正常。问题是当我在生产服务器上时,当我运行 rake assets:precompile 并且有一个 assets 目录时,文件会下载两次。第一次下载文件时,浏览器表现得好像什么都没有发生(没有加载旋转),但我在 Google Chrome 网络开发人员的网络选项卡中看到数据正在传输。然后在下载文件后,会出现一个提示,询问用户是否要下载文件。

删除公共目录中的资产文件夹可以解决这个问题,但我想使用资产管道。我还尝试将资产管道要求从 require_tree 更改为 require_directory。

有谁知道如何让 send_file 与资产管道正常工作?

谢谢。

4

2 回答 2

8

对于任何有这个问题的人,我都解决了。经过

'data-no-turbolink' => true 

进入 link_to 帮助程序以阻止 Turbolinks 干扰下载。

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

于 2013-07-06T22:08:44.743 回答
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
于 2015-01-08T10:13:48.570 回答