Rails ActionDispatch::Http::UploadedFile to File

发布时间 2023-12-20 09:08:38作者: 鞋带松了

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)