web-dev-qa-db-ja.com

Railsにファイルをアップロードする

私はRailsを初めて使用し、CRUD手法を使用してRESTful Webサイトを作成しています。これまでに、3つのページを作成しました。これらのすべてを使用して、ユーザーはデータベースから行を作成、編集、および削除できます。ただし、4番目のページにはアップロードファイルフォームを含める必要がありますが、a)ファイルシステムがRailsでどのように機能するかがわからないため、ファイルを保存する場所がわかりません。ファイルは約100 kbになり、常にダウンロードされるため、一時ストレージに保存できませんでした。 b)ファイルへの書き込み方法がわかりません。

上記で説明したことを行う方法を教えていただければ幸いです-入力フォームでアップロード入力を作成し、別のディレクトリのファイルパスにファイルを書き込みます。

69
max_

2018年に更新

以下に書かれていることはすべて当てはまりますが、Rails 5.2にはactive_storageが含まれ、S3(または他のクラウドストレージサービス)への直接アップロード、画像変換などが可能になります。 Railsガイド そして、自分のニーズに合ったものを自分で決めます。


ファイルのアップロードをかなりうまく解決する宝石がたくさんありますが(リストについては https://www.Ruby-toolbox.com/categories/Rails_file_uploads をご覧ください)、Railsが構築されました-独自のソリューションを簡単に展開できるヘルパー。

フォームでfile_field- formヘルパーを使用すると、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

119
fabi

2018年9月

最近この質問をチェックしている人は、 Rails 5.2+にはデフォルトでActiveStorageがあります。チェックアウトすることを強くお勧めします。

コアRails 5.2+の一部であるため、非常によく統合されており、すぐに使用できる優れた機能を備えています(Carrierwave、Shrine、Paperclipなどの他のすべての有名な宝石は...すばらしいですが、これは非常に優れた機能を提供しており、新しいRailsプロジェクトで検討できます)

Paperclipチームは、Rails ActiveStorageを支持してgemを廃止しました。

ここにActiveStorageのgithubページがあります &多くのリソースがどこでも利用可能です

このビデオも見つけました Activestorageの機能を理解するのに非常に役立つ

5
Ahmed Elkoussy

特にファイルをアップロードするための素晴らしい宝石があります: carrierwave 。 wikiが役に立たない場合は、 Nice RailsCast を使用して最適な方法を使用してください。要約すると、Rails formsにはfileというフィールドタイプがあり、ファイルアップロードダイアログを呼び出します。使用できますが、「魔法」はcarrierwave gemによって実行されます。

「ファイルへの書き込み方法」とはどういう意味かわかりませんが、これがいいスタートになることを願っています。

3
R Milushev

はい。ファイルをデータベースに保存せず、アセット(カスタムフォルダー)などのアプリケーションに保存したくない場合は、attr_accessor:documentで定義された非dbインスタンス変数を定義し、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.rbanを追加します

フォームがファイルフィールドを読み込むたびに、tmpフォルダに保存され、後であなたの場所に保存することができます。資産に保存する例を示しました

:このようなファイルを保存すると、アプリケーションのサイズが大きくなり、Paperclipを使用してデータベースに保存する方が適切です。

0
ray

あなたの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

これを使用して、ローカルで実行中にファイルに保存します

0
Saif chaudhry