概要
Webフォームからアップロードされたファイルデータの扱いがよくわかっていないので、
文献を拾ってまとめた。
前提として、「file」というキーで、「PC内の/home/user/xxx.csv」という適当なCSVファイルがアップロードされたものとする。
参考
-
Tempfile
→Fileクラスと同じように扱える。
スクリプト実行が終了したとき削除される。
まとめ
# アップロードファイル情報
uploaded_file = params[:file]
→ActionDispatch::Http::UploadedFile型でアップロードしたファイルの情報が返ってくる。
以降、uploaded_fileは「ActionDispatch::Http::UploadedFile」のインスタンスになっていることを意識。
# ファイル名
uploaded_file.original_filename
→String型でファイル名(パスを含まず、拡張子を伴うもの)が返ってくる(xxx.csvとか)
# コンテンツタイプ
uploaded_file.content_type
→String型でMIME_TYPEが返ってくる(text/csv とか)
# アップロードされたファイルのTempfileインスタンス
uploaded_file.tempfile
→ファイルをformからアップロードすると、tempfileインスタンスが作られ、リクエストに対するサーバー側での一連の処理終了後に削除される模様。
# Tempfileインスタンスを経由するショートカットメソッド群
## 一時ファイルのサイズ
uploaded_file.size
→Integer型でファイルサイズ(バイト単位)が返ってくる
## 一時ファイル本体の読み込み
uploaded_file.read
→String型で読み込んだ全行分の文字列が返ってくる
## 一時ファイルのパス
uploaded_file.path
→String型でパスが返ってくる
アップロードしたファイルの保存
リクエストに対するサーバー側での一連の処理が終わり一時ファイルが削除される前に、
独自に保存処理を書いてやらなければならない。
# アップロードファイル情報を取得
uploaded_file = params[:file]
# アップロードファイル(一時ファイル)パス
uploaded_temp_file_path = uploaded_file.path
# アップロードファイル(元ファイル)名
uploaded_file_original_file_name = uploaded_file.original_filename
# アップロードファイル(一時ファイル)を全行分読み込んだもの
uploaded_file_content = uploaded_file.read
# 保存先ディレクトリパス
save_dir_path = Pathname("/aaa/")
# 保存先ディレクトリを作成
run_cmd("mkdir -p #{save_dir_path}")
# 保存先ファイルパス
save_file_path = save_dir_path.join(uploaded_file_original_file_name)
# ファイルを保存(〜へ〜を書き込むという引数順序)
File.binwrite(save_file_path, uploaded_file_content)