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