当调用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 }
答案 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))) %>