file: file_upload.cgi
#!/usr/bin/ruby # ruby script fragment require 'cgi' require 'stringio' cgi = CGI.new() # New CGI object puts "Content-Type: text/plain" puts print '<result>' # get uri of tx'd file (in tmp normally) tmpfile = cgi.params['myfile'].first.path # OR (functionally the same) tmpfile = cgi.params['myfile'][0].path # create a Tempfile reference fromfile = cgi.params['myfile'].first #displays the original file name as supplied in the form puts fromfile.original_filename # displays the content (mime) type e.g. text/html puts fromfile.content_type # create output file reference as original filename in our chosen directory tofile = '/var/www/yourdomain.com/htdocs/r/'+fromfile.original_filename # copy the file # note the untaint prevents a security error # cgi sets up an StringIO object if file < 10240 # or a Tempfile object following works for both File.open(tofile.untaint, 'w') { |file| file << fromfile.read} # when the page finishes the Tempfile/StringIO!) thing is deleted automatically print '</result>'
file: file_upload.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>File upload</title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> </head> <body> <form name='fileupload' enctype="multipart/form-data" action='/p/file_upload.cgi' method='post'> <input type='file' name='myfile' size="40" /> <input type='submit' value"Send it"/> </form> </body> </html>