4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2022-04-19

概要

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)
4
1
1

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
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?