2016-08-24 79 views
0

當send_file被調用時,它將文件發送到瀏覽器,但瀏覽器將內容作爲純文本轉儲到新頁面上,而不是下載文件。如果我刷新該頁面,則會正常下載文件。Rails將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)) %> 

解決方案: 這最終成爲known issue turbolinks。如果使用Turbolinks 5像我,更新的語法是:data: { turbolinks: false }

回答

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注入字符串以構建下載路徑。我可以將「../../」注入到:name,「config」中,寫入:batch,並將「../config/database.yml」注入到:file中。將文件路徑添加到模型。

+0

處置默認爲 '附件' 更新鏈接。我試圖設置它,並且遇到了相同的結果。我也確保文件擴展名是根據您的建議正確的,並得到相同的結果。 –

+0

如果我直接去這裏,它只會下載罰款'「http:// localhost:3000/download?batch = 1&file = HSS.xls&name = HSS + 2016」',只有當我從不同頁面鏈接到此路徑時,在瀏覽器中顯示純文本,然後像我在文章中提到的那樣,刷新純文本頁面,然後將該文件正常下載。 –

+0

編輯我的帖子上面,我解決了這個問題。 –

2

這最終成爲了turbolinks的一個已知問題。如果使用Turbolinks 5像我,更新的語法是:

data: { turbolinks: false } 
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))) %> 
相關問題