カッティングボード

カルマをカットしてます

Ruby on Railsのfile.readの挙動

 html側でfileをアップロードするinputフォームを作成し、それをサーバー側で中身を受け取ろうとしたときに詰まったのでそのまとめ。

      f = params[:target_file]
      if(params[:target_file].present?)
        @original_filename = f.original_filename    # ファイル名
        @content_type = f.content_type                # Content-Type
        @size = f.size                               # ファイルサイズ
        @read = f.read                               # ファイルの内容

      puts '----------------'
      puts f.size
      puts f.read
      puts '----------------'

 以上のようなコードを書いて受け取ったファイルのサイズと中身を表示しようとしていたが、puts f.readは何も出力されなかった。なぜ中身を受け取ることができないのか探したのですが、結果としてこのコードでファイルの中身を受け取ることができていました。file.readは2度実行すると2回目に実行された方はnullになってしまう仕様でした。一度readされるとシークがファイルの最後まで進んでしまうため、2度目に実行する前にf.rewindを実行してシークをファイルの始めの位置に戻してあげないと、ファイルがうまく受け取れていないように見えてしまいます。
 一度変数で受け取った値は、受け取った変数を出力して中身が入っているか確認することでこのようなことは避けられるんじゃないかなー。