ActionDispatch::Http::UploadedFileのコードリーデイング
概要
ActionDispatch::Http moduleに class UploadedFile が定義されている。
サーバーにアップロードされたtime fileを扱うクラス。
pickup
initialize以外の処理は@tempfileに対するショートカット。
initializeでは、ファイルの有無チェックとファイル名のエンコードをUTF8に変換する処理を行っている。
ファイル名エンコード処理。
force_encodingは実際にエンコードの変換処理を行なうのではなく、エンコーディングの情報だけ設定する。
if @original_filename begin @original_filename.encode!(Encoding::UTF_8) rescue EncodingError @original_filename.force_encoding(Encoding::UTF_8) end end
encode!で発生するエラーは
- 変換後のエンコーディングに対応するコードがない場合 Encoding::UndefinedConversionError
- 変換前の文字列に不正なコードがある場合 Encoding::InvalidByteSequenceError
がある。 どちらの場合もエンコーディング情報だけUTF8に設定している。
エンコーディングに関する参考記事
Ruby の invalid byte sequence in UTF-8 例外を encode("UTF-8", "UTF-8") で回避するのはおかしいよ、という話 - sonots:blog
Ruby 2.1.0 に追加される不正なバイト列を除去する String#scrub の紹介 - sonots:blog