Rails send_file将文件呈现为新页面上的纯文本而不是浏览器下载文件

时间:2016-08-24 20:37:57

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

当调用send_file时,它将文件发送到浏览器,但浏览器将内容作为纯文本转储到新页面而不是下载文件。如果我刷新该页面,则会正常下载该文件。

路线

get 'download' => 'qr_codes#download'

控制器

def download
    path = Rails.root.join("events/active/#{params[:name]}/#{params[:batch]}/#{params[:file]}")
    send_file(path, type: 'application/vnd.ms-excel', filename: params[:file])
end

查看

<%= link_to 'Original Upload', download_path(name: @event_name,
  batch: batch, file: batch_upload_filename(@event_name, batch)) %>

解: 最终成为具有turbolinks的known issue。如果像我一样使用Turbolinks 5,则更新语法为:data: { turbolinks: false }

3 个答案:

答案 0 :(得分:3)

这最终成为turbolinks的一个已知问题。如果像我一样使用Turbolinks 5,更新的语法是:

data: { turbolinks: false }

答案 1 :(得分:1)

尝试设置处置:

def download
  path = Rails.root.join("events/active/#{params[:name]}/#{params[:batch]}/#{params[:file]}")
  send_file(path, type: 'application/vnd.ms-excel', filename: params[:file], disposition: 'attachment')
end

或更改文件以确保扩展名正确

"#{params[:file][0,params[:file].index(".")]}.xlsx"

哦,不要将params注入字符串以构建下载路径。我可以注射&#34; ../../" into:name,&#34; config&#34;,into:batch,&#34; ../ config / database.yml&#34;进入:文件。将文件路径添加到模型中。

答案 2 :(得分:0)

制作帮手方法

def some_helper(content_type)
 Rack::Mime::MIME_TYPES.invert[content_type].gsub(/\./mi, '')
end

并将链接更新为

<%= link_to 'Original Upload', download_path(name: @event_name, batch: batch, file: batch_upload_filename(@event_name, batch, format: file_format(attachment.file.content_type))) %>