【发布时间】:2013-07-04 14:48:17
【问题描述】:
我的应用程序目录中有一个名为“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 与资产管道正常工作?
谢谢。
【问题讨论】:
-
看起来是 Turbolinks 导致了这个问题。我可以看到 javascript 中的这个函数被调用:
visit = function(url) { if (browserSupportsPushState && browserIsntBuggy) { cacheCurrentPage(); reflectNewUrl(url); return fetchReplacement(url); } else { return document.location.href = url; } };这导致文件被下载两次。现在的问题是……我怎样才能为一种方法禁用 turbolinks? -
对于任何有这个问题的人,我都解决了。将
'data-no-turbolink' => true传递给 link_to 帮助程序,以阻止 Turbolinks 干扰下载。
标签: ruby-on-rails ruby-on-rails-4 sendfile