[英]Uploading a file in Rails
我是新來的鐵軌,和我使用的CRUD技術寫一個RESTful網站。 到目前為止,我已經創建了三個頁面,所有這些頁面都允許用戶從數據庫中創建,編輯和刪除一行。 然而,我的第四頁將需要包括上傳文件的形式,但)我不知道是怎么工作的文件系統使用Rails因此,我不知道在哪里的文件應存放。 該文件約為100kb,由於會不斷下載,因此無法存儲在臨時存儲中。 和b)我不知道如何寫一個文件。
如果您能告訴我如何做上面提到的事情,那就太好了–在輸入表單上創建上載輸入,然后將文件寫入單獨目錄中的文件路徑。
更新2018
雖然一切都寫在下面仍然是成立的,Rails的5.2現在包括active_storage
,允許類的東西上傳直接S3(或其他雲存儲服務),圖像變換等,您應該檢查導軌導向 ,並決定自己是什么適合您的需要。
雖然有很多能夠解決文件上傳很漂亮(見寶石https://www.ruby-toolbox.com/categories/rails_file_uploads的列表),導軌具有內置的助手,這使得它很容易推出自己的解決方案。
在您的表單中使用file_field
helper,Rails會為您處理上傳:
<%= form_for @person do |f| %>
<%= f.file_field :picture %>
<% end %>
您將在控制器中訪問上傳的文件,如下所示:
uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
這取決於您要實現的目標的復雜性,但這對於完成簡單的文件上載/下載任務完全足夠。 此示例摘自Rails指南,您可以在此處獲取更多信息: http : //guides.rubyonrails.org/form_helpers.html#uploading-files
2018年9月
對於最近檢查此問題的任何人, Rails 5.2+現在默認都有ActiveStorage,我強烈建議您檢查一下。
既然是核心的一部分,現在的Rails 5.2+,這是很好的集成和具有開箱即用(還是其他知名的寶石一樣Carrierwave,神殿,紙夾的優秀能力,......是偉大的,但這個報價很我們可以在任何新的Rails項目中考慮的良好功能)
回形針團隊不贊成使用Gems,而是使用Rails ActiveStorage。
這是ActiveStorage的github頁面,到處都有大量資源
另外,我發現該視頻對於了解Activestorage的功能非常有幫助
有一個很好的創業板尤其是對上傳文件: carrierwave 。 如果Wiki不能幫助您,那就有一個很好的RailsCast關於如何使用它的最佳方法。 總而言之,在Rails表單中有一個字段類型file
,它會調用文件上傳對話框。 您可以使用它,但“魔術”是由carrierwave
gem完成的。
我不知道你是什么意思與“如何寫一個文件”,但我希望這是一個良好的開端。
好的。 如果您不想將文件存儲在數據庫中並存儲在應用程序中,例如資產(自定義文件夾),則可以定義attr_accessor:document定義的非數據庫實例變量,並使用form_for - f.file_field
來獲取文件,
在控制器中
@person = Person.new(person_params)
這里person_params
返回白名單的params[:person]
(自己定義的)
另存為
dir = "#{Rails.root}/app/assets/custom_path"
FileUtils.mkdir(dir) unless File.directory? dir
document = @person.document.document_file_name # check document uploaded params
File.copy_stream(@font.document, "#{dir}/#{document}")
請注意,增加這個路徑.gitignore
&如果你想使用此文件再次添加此路徑asset_path
一個由應用程序的application.rb
每當構成讀文件中的字段,它得到店TMP文件夾中,以后你可以在你的地方存放,我給例如存儲在資產
注意 :像這樣存儲文件會增加應用程序的大小,最好使用paperclip
將其存儲在數據庫中。
在您的Intiallizer / carrierwave.rb中
if Rails.env.development? || Rails.env.test?
config.storage = :file
config.root = "#{Rails.root}/public"
if Rails.env.test?
CarrierWave.configure do |config|
config.storage = :file
config.enable_processing = false
end
end
end
在本地運行時使用它來存儲在文件中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.