Rails ActionDispatch::Http::UploadedFile to File
RailsでFileをActionDispatch::Http::UploadedFileに変換する方法
require 'mime/types'
File.open(path) do |file|
filename = File.basename(file.path),
ActionDispatch::Http::UploadedFile.new(filename: filename, type: MIME::Types.type_for(filename).first.to_s, tempfile: file))
end
# eg:
MIME::Types.type_for("filename.gif").first.content_type # => "image/gif"
# アップロードファイル情報
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)