簡體   English   中英

在Rails中上傳文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM