Hi,

Sorry about not jumping into this conversation, I haven't been around.
If you don't specify multipart/form-data, the information is sent
as POST data, basically just encoded name/value pairs in your
ServletInputStream.  So all you're passing is the name of the file
that the client specified.

-----Original Message-----
From: Martin Cooper [mailto:[EMAIL PROTECTED]]
Sent: Monday, June 11, 2001 5:45 PM
To: [EMAIL PROTECTED]
Subject: Re: uploading file requires immediate serialization location?


I don't know what would happen. In particular, I don't know what the 
browser would submit (if anything) in that case. I had thought that the 
HTML spec stated that the enctype must be multipart/form-data when you use 
a file input tag, but I just checked, and it (the 4.01 spec) says "should", 
not "must". Of course, that doesn't mean that browsers will support it! :-)

--
Martin Cooper


At 12:55 PM 6/11/01, [EMAIL PROTECTED] wrote:


>Martin,
>
>Hi.  Can I pick your brain about an earlier post?
>
>I asked what would happen if I have a html:file tag on my form, but without
>changing the enctype to "multipart/form-data"?  Do you know if I just then 
>get a
>String containing the filename selected/entered?
>
>thanks,
>
>Dave
>
>
>
>
>"Martin Cooper" <[EMAIL PROTECTED]> on
>06/11/2001 01:55:07 AM
>
>Please respond to [EMAIL PROTECTED]
>
>To:   [EMAIL PROTECTED], "Jonathan
Asbell"
>       <[EMAIL PROTECTED]>
>cc:    (bcc: David Hay/Lex/Lexmark)
>Subject:  Re: uploading file requires immediate serialization location?
>
>
>
>String parameters are not written to a file. Only the bodies of file upload
>parts are written to disk, and each one to a separate file. The files are
>written as the input stream (i.e. the request) is processed.
>
>Let's say your form has two fields, a textarea called 'myText' and a file
>input called 'myFile'. After you submit it, and Struts has populated your
>form bean, you will have:
>
>1) The text from the textarea field is stored in the bean's 'myText'
>property as a String.
>2) The uploaded data is stored in a temporary file somewhere on disk.
>3) The 'myFile' property on your bean, which has type FormFile, contains
>information about the uploaded data (e.g. file name, content type, etc.).
>
>The bean is in either request or session scope, as you defined it in your
>struts-config.xml file. If the bean goes away, then so does the file that
>holds the uploaded data.
>
>Hope this helps.
>
>--
>Martin Cooper
>
>
>----- Original Message -----
>From: "Jonathan Asbell" <[EMAIL PROTECTED]>
>To: <[EMAIL PROTECTED]>
>Sent: Sunday, June 10, 2001 10:48 PM
>Subject: Re: uploading file requires immediate serialization location?
>
>
> > So do you simultaneously write to a file while reading a String
parameter
> > when you process a form?  What parts of the multipart request do we save
>in
> > the bean, and in what scope?
> >
> > ----- Original Message -----
> > From: "Martin Cooper" <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>; "Jonathan Asbell"
><[EMAIL PROTECTED]>
> > Sent: Monday, June 11, 2001 1:23 AM
> > Subject: Re: uploading file requires immediate serialization location?
> >
> >
> > > Yes, I think you've got it. Just to be clear, though, when you say "we
> > need
> > > to examine the sections in the header ...", the "we" here is Struts -
>you
> > > don't need to do anything in your application. Struts makes
>getParameter()
> > > et all work for multipart requests as well as regular requests.
> > >
> > > What you are seeing in the packages you've looked at is the parsing of
a
> > > MIME part. The fields in a multipart/form-data request each conform to
>the
> > > specification for a MIME part, and they are separated by a boundary,
>which
> > > is a line containing a pattern defined in a header at the top of the
> > > request.
> > >
> > > Each MIME part consists of a sequence of MIME headers, followed by a
>blank
> > > line, followed by the data for that MIME part, known as the body. A
MIME
> > > header takes the form "header-name: value" - for example,
"Content-type:
> > > text/plain". The body is just a bunch of data that conforms to the
> > > statements made about it in the headers.
> > >
> > > Every field in a multipart request is encoded this way. So where a
>regular
> > > query using GET might contain a query string like this:
> > >
> > > ...&author=Martin&...
> > >
> > > a multipart request would represent the same query parameter like
this:
> > >
> > > -----------------------------0123456789--
> > > Content-disposition: form-data; name="author"
> > >
> > > Martin
> > > -----------------------------0123456789--
> > >
> > > For a file upload, the difference is only that the Content-disposition
> > > header will include a file name, and the data can be binary if
>necessary.
> > >
> > > When a multipart handler processes a request, it is reading the data
>from
> > an
> > > input stream provided by the container. Typically, for regular query
> > > parameters, it will store the value in a hash table. For file
>parameters,
> > it
> > > will store the data in a file and retain information about that file.
>The
> > > Struts implementation uses the FormFile interface to provide access to
> > that
> > > information.
> > >
> > > A multipart implementation could do whatever it wanted to with the
data
> > > provided from a file upload. Although the Content-disposition header
may
> > > specify a file name, there is no requirement to store that data as a
>file.
> > > One implementation that would make sense would be to define a size
> > > threshold, and store uploaded objects below that size in memory, while
> > > writing larger ones to disk.
> > >
> > > Regarding form beans and binary data, there is no reason why a field
in
>a
> > > form bean cannot be a byte array. However, by itself that is not very
> > > useful, hence the FormFile interface. If you'll notice, that interface
> > does
> > > in fact have a getFileData() method, which will give you the uploaded
>data
> > > as a byte array. In the current implementation, what that actually
does
>is
> > > load the contents of the file into memory and hand you back that
memory.
> > And
> > > there you have binary data in a form field.
> > >
> > > Hope this helps.
> > >
> > > --
> > > Martin Cooper
> > >
> > >
> > > ----- Original Message -----
> > > From: "Jonathan Asbell" <[EMAIL PROTECTED]>
> > > To: <[EMAIL PROTECTED]>
> > > Sent: Sunday, June 10, 2001 1:19 PM
> > > Subject: Re: uploading file requires immediate serialization location?
> > >
> > >
> > > > Martin, you seem to understand this subject well, so let me take a
>shot
> > > and
> > > > tell me if I am correct:
> > > >
> > > > A multi-part request is a request, but a different one.  That is,
with
>a
> > > > regular request things have been abstracted for us nicely with
> > > > "getParameter" etc., but a request submitted as multipart is not
>handled
> > > > nicely for us by the servlet spec and is a whole different animal.
>This
> > > > type of request needs to be handled uniquely (though I dont
understand
> > why
> > > > the servlet spec does not have standard abstractions for it),
because
>it
> > > may
> > > > contain binary non-text content accompanied by regular content.  In
>such
> > a
> > > > request we need to examine the sections in the header and parse for
> > > certain
> > > > values we are expecting to separate out the regular text values
> > submitted
> > > > from the binary parts, and then handle the binary parts.
> > > >
> > > > Things I still dont get:
> > > > In all packages I have examined that handle multipart requests,
there
>is
> > > > always a notion of looking for the line ": ", then looking for the
>blank
> > > > line after that, and then reading in binary values that follow the
>blank
> > > > line up until the "boundry" which is a String in a known format (see
> > link
> > > > below).  What I dont understand is what are our options in handling
>this
> > > > binary stuff which is not text.  Most packages I have seen write it
to
>a
> > > > file.  I'm not sure if there is a way to save a binary object at
all,
> > let
> > > > alone save it in a filed value in a bean.  How do you store a binary
> > > object
> > > > in a field?
> > > >
> > > > ==============
> > > > REFERENCE
> > > > ==============
> > > > For those interested see this article:
> > > > www.onjava.com/lpt/a//onjava/2001/04/05/upload.html
> > > > Available servlet packages http://www.servlets.com/cos/index.html
> > > >
> > > >
> > > >
> > > > ----- Original Message -----
> > > > From: "Martin Cooper" <[EMAIL PROTECTED]>
> > > > To: "Jonathan Asbell" <[EMAIL PROTECTED]>
> > > > Cc: <[EMAIL PROTECTED]>
> > > > Sent: Sunday, June 10, 2001 3:01 PM
> > > > Subject: Re: uploading file requires immediate serialization
location?
> > > >
> > > >
> > > > > Good question. What you are really asking is "what does the
> > <html:file>
> > > > tag
> > > > > do?".
> > > > >
> > > > > Struts will generate an <input type="file" ... > tag, where the
>value
> > of
> > > > the
> > > > > 'name' attribute is taken from the 'property' attribute of your
> > > > <html:file>
> > > > > tag. It will also generate a 'value' attribute. Looking at the
>source
> > > > code,
> > > > > it seems that the valueof the 'value' attribute will be the result
>of
> > > > > calling toString() on the FormFile object. Since that object
doesn't
> > > > > override toString(), the result will be nothing useful. On the
other
> > > hand,
> > > > > browsers usually ignore the 'value' attribute anyway.
> > > > >
> > > > > At this point, the original uploaded file is still on the disk,
and
> > will
> > > > > remain there until the form is resubmitted. Then it will be
deleted
>as
> > a
> > > > > part of setting up for parsing the new multipart data.
> > > > >
> > > > > Hope this helps.
> > > > >
> > > > > --
> > > > > Martin Cooper
> > > > >
> > > > >
> > > > > ----- Original Message -----
> > > > > From: "Jonathan Asbell" <[EMAIL PROTECTED]>
> > > > > To: "Martin Cooper" <[EMAIL PROTECTED]>
> > > > > Sent: Sunday, June 10, 2001 5:47 AM
> > > > > Subject: Re: uploading file requires immediate serialization
>location?
> > > > >
> > > > >
> > > > > > Great explanation Martin. Thank you.  So what you really have
said
> > is
> > > > that
> > > > > > the stream contents gets turned into a FormFile object.  Ok.
Now
> > the
> > > > big
> > > > > > question.  You know when a form is not valid it gets sent beack
to
> > the
> > > > > > client as strings which pre-populate the form fields.  How will
>this
> > > > occur
> > > > > > in the case of a file input?
> > > > > >
> > > > > >
> > > > > > ----- Original Message -----
> > > > > > From: "Martin Cooper" <[EMAIL PROTECTED]>
> > > > > > To: <[EMAIL PROTECTED]>; "Jonathan Asbell"
> > > > > <[EMAIL PROTECTED]>
> > > > > > Sent: Sunday, June 10, 2001 12:20 AM
> > > > > > Subject: Re: uploading file requires immediate serialization
> > location?
> > > > > >
> > > > > >
> > > > > > > Let me see if I can describe the process.
> > > > > > >
> > > > > > > 1. Check to see if the request should be treated as multipart
> > (i.e.
> > > > > > content
> > > > > > > type is multipart/form-data and method is POST). If not, carry
>on
> > as
> > > > > > normal.
> > > > > > > 2. Find the multipart handler or instantiate one, set it on
the
> > form
> > > > > bean,
> > > > > > > and call it to handle the request.
> > > > > > > 2a. Iterate over the fields (parts) in the request.
> > > > > > > 2a1. If the current part is not a file, store it as a String.
> > > > > > > 2a2. If the current part is a file (according to the
> > > > Content-Disposition
> > > > > > > header), create a new file in the temp directory, stream the
> > content
> > > > of
> > > > > > the
> > > > > > > part to that file, create a new object which implements
>FormFile,
> > > and
> > > > > > store
> > > > > > > the file data in it.
> > > > > > > 2b. Turn the set of fields into something that looks like
>regular
> > > > > request
> > > > > > > parameters.
> > > > > > > 3. Populate the ActionForm instance from the set of request
> > > > parameters.
> > > > > > > Here, the value of a file parameter has type FormFile, so it
> > matches
> > > a
> > > > > > > setter on the form bean that takes a FormFile as a parameter.
> > > > > > >
> > > > > > > That's the gist of it, although there are some other nitty
>gritty
> > > > > details.
> > > > > > > Almost all of this happens inside the code that populates the
>form
> > > > bean
> > > > > > from
> > > > > > > request parameters.
> > > > > > >
> > > > > > > It appears (from my reading of the source, anyway) that the
> > > temporary
> > > > > > files
> > > > > > > will not be automatically deleted until another request comes
in
> > > that
> > > > > uses
> > > > > > > the same form bean instance, or until the form bean instance
>goes
> > > > away.
> > > > > > > Given that, I would recommend calling
> > > setMultipartRequestHandler(null)
> > > > > > from
> > > > > > > your form bean's reset() method if you keep your beans in
>session
> > > > scope.
> > > > > > >
> > > > > > > The part you are interested in, I believe, is 2a2 above.
> > > > Unfortunately,
> > > > > > that
> > > > > > > code is buried inside an iterator class, so you can't override
> > just
> > > > that
> > > > > > > piece. I assume what you would want is that the data is kept
in
> > > memory
> > > > > > > instead of to a file. Interestingly, I believe the original
> > > > > implementation
> > > > > > > did this, but it was changed to use files because of potential
> > > memory
> > > > > > > problems with large uploads.
> > > > > > >
> > > > > > > Hope this helps.
> > > > > > >
> > > > > > > --
> > > > > > > Martin Cooper
> > > > > > >
> > > > > > >
> > > > > > > ----- Original Message -----
> > > > > > > From: "Jonathan Asbell" <[EMAIL PROTECTED]>
> > > > > > > To: <[EMAIL PROTECTED]>
> > > > > > > Sent: Saturday, June 09, 2001 8:11 PM
> > > > > > > Subject: Re: uploading file requires immediate serialization
> > > location?
> > > > > > >
> > > > > > >
> > > > > > > > Hello Martin.  So is it POSSIBLE to save binary data in a
>bean?
> > > > What
> > > > > > does
> > > > > > > > struts do?  These are my real questions.  If I have a form
>which
> > > > > besides
> > > > > > > > fields, has an uploaded file, how does the bean actually
>handle
> > > the
> > > > > > file?
> > > > > > > > Is there a conceptual step by step you can give me.  How
does
> > the
> > > > > > > ActionForm
> > > > > > > > save (and validate) the binary data sent via input type
>"file".
> > > > > > > >
> > > > > > > >
> > > > > > > > ----- Original Message -----
> > > > > > > > From: "Martin Cooper" <[EMAIL PROTECTED]>
> > > > > > > > To: <[EMAIL PROTECTED]>; "Jonathan Asbell"
> > > > > > > <[EMAIL PROTECTED]>
> > > > > > > > Sent: Saturday, June 09, 2001 10:55 PM
> > > > > > > > Subject: Re: uploading file requires immediate serialization
> > > > location?
> > > > > > > >
> > > > > > > >
> > > > > > > > > Internally to Struts, multipart handling is provided
through
> > an
> > > > > > > interface,
> > > > > > > > > MultipartRequestHandler. In Struts 1.0, the only supplied
> > > > > > implementation
> > > > > > > > of
> > > > > > > > > this interface is DiskMultipartRequestHandler, which, as
you
> > > might
> > > > > > > expect,
> > > > > > > > > writes "file" parts to disk as it encounters them.
> > > > > > > > >
> > > > > > > > > Struts does allow you to configure the multipart handler
to
> > use,
> > > > by
> > > > > > > > > specifying the class name in the multipartClass init-param
>for
> > > > your
> > > > > > web
> > > > > > > > app.
> > > > > > > > > This allows you to provide your own implementation if you
>want
> > > to
> > > > > > > > (although
> > > > > > > > > this is no small task).
> > > > > > > > >
> > > > > > > > > --
> > > > > > > > > Martin Cooper
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > ----- Original Message -----
> > > > > > > > > From: "Jonathan Asbell" <[EMAIL PROTECTED]>
> > > > > > > > > To: <[EMAIL PROTECTED]>
> > > > > > > > > Sent: Saturday, June 09, 2001 6:39 AM
> > > > > > > > > Subject: uploading file requires immediate serialization
> > > location?
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > Hello all.
> > > > > > > > > I am just trying to understand an aspect of a multipart
> > request.
> > > > > When
> > > > > > > > > you submit after using an input of type "file", do you
have
>to
> > > > > provide
> > > > > > > > > an immediate location for the file to be serialized to, or
>can
> > > you
> > > > > > store
> > > > > > > > > it in a java object (in a bean's field) as a binary object
> > until
> > > > you
> > > > > > are
> > > > > > > > > ready to serialize it.  The reason is that I want to hold
a
> > jpeg
> > > > in
> > > > > a
> > > > > > > > > bean until the person completes the last page of the form,
>and
> > > > THEN
> > > > > > > > > serialize it.
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > >
> > >
> >

Reply via email to