Martin Hart wrote:

>Hi all,
>
>I have a single HTML form which contains simple text controls as well as file 
>upload controls.  I had assumed that the CGI library would return me items of 
>type String for the text boxes and items of type Tempfile for the file upload 
>boxes....
>
>However, it appears (after searching the archives) that StringIO is used 
>instead of Tempfile on ruby 1.8 (in some cases and not others?), and that as 
>soon as you specify an enctype of multipart you never? receive Strings but 
>always receive either Tempfile or StringIO.
>
>This is what i really want from the CGI library:
>* CGI returns *everything* as a string except for file uploads - which are 
>returned as Tempfiles
>
>Assuming that I cannot have that :-) can somebody in the know please tell me 
>(or point me to some documentation)...
>
>1. how can I tell whether or not the supplied parameter was a file upload or 
>simple text that has been passed to me as a Tempfile/StringIO?  At the moment 
>I don't know whether to copy the file or not - because I don't know if it is 
>a valid file or just another parameter.
>  
>
If it is just posted, its text. If you use enctype=multipart/form-data 
then all will be files.
If you use the second, use $cgi['your_form_item'][0].read to get the 
text value.

For example:
oOverwrite = $cgi['overwrite'][0] #this is a checkbox
if oOverwrite
         overwrite = oOverwrite.read.chomp #i'm reading it's value
         if overwrite == 'on' then bOverwrite = true end
end

Notice i never close the tmp file. Never thot about it ;o)

>2. do hidden controls work with multi-part forms?  there is some discussion of 
>them not working on the mailing list dating back to last November but I don't 
>know if that has been fixed or not.  My limited testing here indicates that 
>hidden parameters are ignored on multipart forms?
>
>  
>
Yes. You'll need to access them as if they were a file -  like above.

>3. why are all values expressed as Tempfile/StringIO when using a multipart 
>form?  Why not just have the file uploads as tempfiles?
>
>  
>
I've not used StringIO

>4. how does the CGI library determine whether or not to switch between 
>Tempfile/StringIO
>
>  
>
Dont know

>5. do I have to specifically close the IO object (assuming that one is 
>returned?) - or perhaps I do not have to close the StringIO but I do have to 
>close the Tempfile?
>
>  
>
Hum, dont know.I've never closed them

>6. are all of the form parameters in different tempfiles or are they all in 
>one?  Say i close the file after reading 1 argument ... does this mean that I 
>cannot read any more?
>
>  
>
I _think_ they are individual files.

Somthing to note : IE sends the whole path for the file name. NS(1.6) 
only send the name.

CGI can be kind of counter intuitive - but it will work!

:P