Search code examples
rubyfile-uploadruby-on-rails-2

rails 2 read file from http post body


I am using rails 2 and I am trying to read a file from http post request body.

  def get_file_from_request(request, file_name)
    file = Tempfile.new([File.basename(file_name, ".*"), File.extname(file_name)])
    Rails.logger.info "#{request.body.size}" # returns 130
    file.write(request.body.read)
    file
  end

If I do

request.inspect

I get following:

...
"rack.version"=>[1, 2], "rack.input"=>#<PhusionPassenger::Utils::TeeInput:0x0000000d3a6148 @len=130, @socket=nil, @bytes_read=130, @tmp=#<StringIO:0x0000000d3a60d0>>, "rack.errors"=>#<IO:<STDERR>>, "rack.multithread"=>false, "rack.multiprocess"=>true, "rack.run_once"=>false, "rack.url_scheme"=>"http", "rack.hijack?"=>true, "rack.hijack"=>#<Proc:0x0000000d3a5ec8@/data/rbenv/.rbenv/versions/1.9.3-p550/lib/ruby/gems/1.9.1/gems/passenger-4.0.42/lib/phusion_passenger/rack/thread_handler_extension.rb:69 (lambda)>,
...

Are there any obvious problems with my approach?

Can someone help me with extracting files from request body? The file is definitely not 130 bytes. Its is like 3 MB.

EDIT: Here is the controller class

class Api::PhotosController < Api::BaseController
  before_filter :verify_session, :except => [:new, :show_image]

  def create
    Rails.logger.info "upload photo request: params=#{params.inspect}, request=#{request.inspect}"
...
      file = get_file_from_request(request, params[:file_name])
...
  rescue => e
    Rails.logger.info "Could not upload photo: params=#{params.inspect}, exception=#{e.backtrace}"
    render_error(e)
  end

private

      def get_file_from_request(request, file_name)
        file = Tempfile.new([File.basename(file_name, ".*"), File.extname(file_name)])
        Rails.logger.info "#{request.body.size}" # returns 130
        file.write(request.body.read)
        file
      end
end

Solution

  • In Rails 2 you may have to use request.raw_post. Does that help?