2009-10-09 51 views
1

我已經做到了這一點:強制從控制器操作下載公共目錄中的文件?

<% response.headers['Content-Disposition'] = "attachment; 
     filename=somefile.txt" -%> 

I am a text file! 

我想迫使我的公用文件夾文件的下載沒有透露的路徑,所以我有一個控制器比檢查一些PARAMS知道位置(我的公共文件夾),然後我想強制下載:

<% response.headers['Content-Disposition'] = "attachment; 
     filename=#{@invoice.file_name}" %> 

How do I get the file content to be here rather than this text? 

有沒有辦法做到這一點?

回答

5

我認爲send_file會做你想做的。

send_file '/path/to.file', :type => 'text/plain', :disposition => 'inline' 
+1

獲取「無法讀取文件/path/to/file.pdf」,但它在那裏 – 2009-10-09 15:47:29

+0

用戶(您的Web服務器運行時)是否可以訪問所有文件目錄到文件? – 2009-10-09 16:03:35

+0

我在這篇文章的幫助下重構了所有內容:http://harrylove.org/2008/12/22/protected-file-downloads-with-ruby-on-rails-and-paperclip,它最後使用send_file。 – 2009-10-09 17:12:01

3

定義標題不是視圖的工作。在控制器中做它會更乾淨。 實際上你不需要任何html視圖來渲染那種文件。

做這樣的事情會更合適:

def action 
    response.headers['Content-Disposition'] = 'attachment; filename=somefile.txt' 
    return render(:text => File.read('/path/to/your/file.txt') 
end 

你保持你的東西乾淨(沒有在你看來職位代碼),並適當地迫使文件的下載。

+1

哦,我差點忘了,如果你的文件太大,你可以使用send_file進行流式處理。 http://api.rubyonrails.org/classes/ActionController/Streaming.html – 2009-10-09 15:37:52

+0

這是一個pdf,我得到一個錯誤,說沒有這樣的文件存在。如果我複製該路徑並將其粘貼到我的瀏覽器中,則文件確實存在。我真的希望我能得到這個工作,否則我不得不重構一堆東西:( – 2009-10-09 15:39:47

+0

你應該把系統路徑。不是http服務器之一。 – 2009-10-09 20:29:32