Ruby on Rails send_file在刷新页面之前不起作用?
我正在研究Rails服务器,我可以从中下载本地存储的电影和动漫等。 这有点工作,但当我点击下载链接时,我必须刷新页面,以便下载实际开始。
这是处理下载的控制器:
class DownloadController < ApplicationController def index @title = params[:title] @name = params[:name] @path = '/media/sf_Anime,_VN,_LN/Watching, not watched yet/'+@title+'/'+@name send_file( @path ) end end
这是链接到该控制器的链接:
编辑:我今天做了一些测试,并注意到如果我尝试发送较小的文件(文本或图像),下载链接会立即生效。 我还注意到下载链接实际上适用于电影,但下载开始需要20-30秒。 你知道导致这种延迟的原因吗?
你在使用turbolinks吗? Turbolinks显然与send_file不一致( https://github.com/rails/turbolinks/issues/182 )。 尝试在link_to帮助器中添加“data:{no-turbolink:true}”(或“’data-no-turbolink’=> true”),例如:
<%= link_to "Downloadable File", downloadable_file, data: { no-turbolink: true } %>
另请参阅: Rails 4,资产管道导致用户可下载文件下载两次 , rails不会将send_data作为文件 , Ruby on Rails send_file,控制器操作中的代码运行两次
编辑以反映以下评论。 我会简单地添加一个关注处理下载然后使用
include Concerns::Downloads
处理您的下载请求。 routes.rb看起来像这样。
resources :movies do member do post 'download' end
并在视图中
<%= link_to 'Download', {:controller => 'movies', :action => 'download'}, {:method => :post } %>
将文件移动到公用文件夹
仅将文件名添加到link_to中
<%= link_to "Downloadable File", "/"+filename, %>
尝试在send_file
设置对附件的处置:
class DownloadController < ApplicationController def index ... send_file( @path, :disposition => 'attachment' ) end end
问题可能是您的浏览器正在尝试打开文件本身 – :disposition => 'attachment'
会提示浏览器下载文件,即使它认为该文件是可以打开的文件。