search
LoginSignup
0

posted at

updated at

[Rails]Webフォームからアップロードされたファイルデータについて

概要

Webフォームからアップロードされたファイルデータの扱いがよくわかっていないので、
文献を拾ってまとめた。
前提として、「file」というキーで、「PC内の/home/user/xxx.csv」という適当なCSVファイルがアップロードされたものとする。

参考

まとめ

# アップロードファイル情報
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)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0