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
In Rails 2 you may have to use request.raw_post
. Does that help?