Small file upload

Hi folks

Searching the list, I notice this problem was introduced a while back
but there was no reply. Anyhow, I'm now finding myself up against it:

I'm trying to upload zip files and unzip them into a directory using
rails. It works fine with larger files; here's the data at the
breakpoint:

irb(#<UploadController:0x2262a84>):001:0> params
=> {"commit"=>"Upload", "action"=>"save_file", "controller"=>"upload",
"site"=>{"name"=>"dh", "zip_file"=>#<File:/tmp/CGI805.1>}}

However, with a smaller file (not just with zip files, actually) i get
the following:

irb(#<UploadController:0x24ad6a4>):001:0> params
=> {"commit"=>"Upload", "action"=>"save_file", "controller"=>"upload",
"site"=>{"name"=>"smalltest01", "zip_file"=>#<StringIO:0x24e0ce8>}}

and the path returns nil.

Does anybody have any insight into this problem? Any help would be
appreciated.

Thanks

cheers
dafydd

Hi~

Hi folks

Searching the list, I notice this problem was introduced a while back
but there was no reply. Anyhow, I'm now finding myself up against it:

I'm trying to upload zip files and unzip them into a directory using
rails. It works fine with larger files; here's the data at the
breakpoint:

irb(#<UploadController:0x2262a84>):001:0> params
=> {"commit"=>"Upload", "action"=>"save_file", "controller"=>"upload",
"site"=>{"name"=>"dh", "zip_file"=>#<File:/tmp/CGI805.1>}}

However, with a smaller file (not just with zip files, actually) i get
the following:

irb(#<UploadController:0x24ad6a4>):001:0> params
=> {"commit"=>"Upload", "action"=>"save_file", "controller"=>"upload",
"site"=>{"name"=>"smalltest01", "zip_file"=>#<StringIO:0x24e0ce8>}}

and the path returns nil.

Does anybody have any insight into this problem? Any help would be
appreciated.

Thanks

cheers
dafydd

  Thats the way rails works. If an uploaded file is less then 10Kb then it will be put in a StringIO, if it is over 10k it will get put in a tmpfile. You will have to branch with conditionals on this to support what you want. If its a StringIO then you need to read it into mem and write it out to wherever you want it. If its a tmpfile then you can just call path on it and move it somewhere.

if StringIO === params[:zip_file]
    data = params[:zip_file].read
    File.open('some/path', 'wb'){|f| f.write data }
else
   # its a tmpfile
end

Cheers-
-- Ezra Zygmuntowicz-- Lead Rails Evangelist
-- ez@engineyard.com
-- Engine Yard, Serious Rails Hosting
-- (866) 518-YARD (9273)

Yow!

Thanks, Ezra.

You Rails folks are exceptionally patient and helpful with newbies.

cheers
dafydd

dafydd wrote:

You Rails folks are exceptionally patient and helpful with newbies.

Because Rails is too.

:wink: