David Friedman
2004-07-20 14:51:03 UTC
RE: Looking for Multiple file upload at once examplePaul,
I'm cc'ing the list so other can learn about this.
The problem is (unless it has been solved and I haven't heard about it) with
the commons file uploads cannot upload multiple files as the very same form
field name. Your velocity template shows the very same name,
"uploadedFiles", used for each file. The last time it was discussed, I
believe the perp (er.. programmer. LOL) used one field and tried to upload
multiple file names in that one field (which is supposedly technically
allowed in file uploads, just not working in any struts-distributed commons
upload version). Your way of using one file name in different fields on the
page is essentially the same thing.
Have you thought of changing those fields to index arrays such as:
Attachment 1: <input type="file" name="uploadedFiles[0]"/>
Attachment 2: <input type="file" name="uploadedFiles[1]"/>
Attachment 3: <input type="file" name="uploadedFiles[2]"/>
Or you could name them randomly such as uploadFiles1, uploadFiles2,
uploadFilesA, uploadFiles27, etc. and use the
CommonsMultipartRequestHandler's getFileElements() method to iterate though
file uploads without worrying about their names. I suppose it all depends
on whether or not you need to I'd recommend using a form with that action,
then casting the form's getMultipartRequestHandler()
method a bit like so:
CommonsMultipartRequestHandler handler = (CommonsMultipartRequestHandler)
form.getMultipartRequestHandler();
HashTable files = handlers.getFileElements();
I haven't used it in a while so if I'm doing a typo on a method name, don't
kill the messenger. :)
Regards,
David
-----Original Message-----
From: Perliti Scorzoni Paolo [mailto:***@siemens.com]
Sent: Tuesday, July 20, 2004 3:42 AM
To: ***@ix.netcom.com
Subject: RE: Looking for Multiple file upload at once example
Hi David.
I'm trying to use a form to upload several files, all at once.
I use Struts and Commons facilities (that is the FormFile interface).
Here's my action form:
public class AttachmentForm
extends ActionForm {
/* Files to upload */
private FormFile[] uploadedFiles;
public FormFile[] getUploadedFiles() {
return uploadedFiles;
}
public void setUploadedFiles(FormFile[] uploadedFiles) {
this.uploadedFiles = uploadedFiles;
}
}
And this is the html code I use to populate the action form (I'm using
Velocity, but I don't think this is really important):
<html>
<body>
...
<form name="uploadForm" method="post" enctype="multipart/form-data"
action="(...my action...)">
...
Attachment 1: <input type="file" name="uploadedFiles"/>
Attachment 2: <input type="file" name="uploadedFiles"/>
Attachment 3: <input type="file" name="uploadedFiles"/>
...
</form>
...
</body>
</html>
Everytime I submit the form I obtain this exception:
javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1254)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.j
ava:821)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
java.lang.IllegalArgumentException: argument type mismatch
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39
)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
.java:25)
java.lang.reflect.Method.invoke(Method.java:324)
org.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.j
ava:1789)
org.apache.commons.beanutils.PropertyUtils.setNestedProperty(PropertyUtils.j
ava:1684)
org.apache.commons.beanutils.PropertyUtils.setProperty(PropertyUtils.java:17
13)
org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:1019)
org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808)
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1252)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.j
ava:821)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
If I adjust the java source to manage one file only (ie. FileForm instead
of FileForm[]) it works, but as I try to use an array I get the Exception.
I use struts 1.1 on Windows XP platform and Tomcat 5.0.24.
I've seen your post about this subject on the jakarta struts-user-list and
I was wondering if you ever had a chance to solve a similar problem.
Is it a bug of commons-beanutils or there's something wrong with my code?
Thanks in advance,
Paul
I'm cc'ing the list so other can learn about this.
The problem is (unless it has been solved and I haven't heard about it) with
the commons file uploads cannot upload multiple files as the very same form
field name. Your velocity template shows the very same name,
"uploadedFiles", used for each file. The last time it was discussed, I
believe the perp (er.. programmer. LOL) used one field and tried to upload
multiple file names in that one field (which is supposedly technically
allowed in file uploads, just not working in any struts-distributed commons
upload version). Your way of using one file name in different fields on the
page is essentially the same thing.
Have you thought of changing those fields to index arrays such as:
Attachment 1: <input type="file" name="uploadedFiles[0]"/>
Attachment 2: <input type="file" name="uploadedFiles[1]"/>
Attachment 3: <input type="file" name="uploadedFiles[2]"/>
Or you could name them randomly such as uploadFiles1, uploadFiles2,
uploadFilesA, uploadFiles27, etc. and use the
CommonsMultipartRequestHandler's getFileElements() method to iterate though
file uploads without worrying about their names. I suppose it all depends
on whether or not you need to I'd recommend using a form with that action,
then casting the form's getMultipartRequestHandler()
method a bit like so:
CommonsMultipartRequestHandler handler = (CommonsMultipartRequestHandler)
form.getMultipartRequestHandler();
HashTable files = handlers.getFileElements();
I haven't used it in a while so if I'm doing a typo on a method name, don't
kill the messenger. :)
Regards,
David
-----Original Message-----
From: Perliti Scorzoni Paolo [mailto:***@siemens.com]
Sent: Tuesday, July 20, 2004 3:42 AM
To: ***@ix.netcom.com
Subject: RE: Looking for Multiple file upload at once example
Hi David.
I'm trying to use a form to upload several files, all at once.
I use Struts and Commons facilities (that is the FormFile interface).
Here's my action form:
public class AttachmentForm
extends ActionForm {
/* Files to upload */
private FormFile[] uploadedFiles;
public FormFile[] getUploadedFiles() {
return uploadedFiles;
}
public void setUploadedFiles(FormFile[] uploadedFiles) {
this.uploadedFiles = uploadedFiles;
}
}
And this is the html code I use to populate the action form (I'm using
Velocity, but I don't think this is really important):
<html>
<body>
...
<form name="uploadForm" method="post" enctype="multipart/form-data"
action="(...my action...)">
...
Attachment 1: <input type="file" name="uploadedFiles"/>
Attachment 2: <input type="file" name="uploadedFiles"/>
Attachment 3: <input type="file" name="uploadedFiles"/>
...
</form>
...
</body>
</html>
Everytime I submit the form I obtain this exception:
javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1254)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.j
ava:821)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
java.lang.IllegalArgumentException: argument type mismatch
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39
)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
.java:25)
java.lang.reflect.Method.invoke(Method.java:324)
org.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.j
ava:1789)
org.apache.commons.beanutils.PropertyUtils.setNestedProperty(PropertyUtils.j
ava:1684)
org.apache.commons.beanutils.PropertyUtils.setProperty(PropertyUtils.java:17
13)
org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:1019)
org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808)
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1252)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.j
ava:821)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
If I adjust the java source to manage one file only (ie. FileForm instead
of FileForm[]) it works, but as I try to use an array I get the Exception.
I use struts 1.1 on Windows XP platform and Tomcat 5.0.24.
I've seen your post about this subject on the jakarta struts-user-list and
I was wondering if you ever had a chance to solve a similar problem.
Is it a bug of commons-beanutils or there's something wrong with my code?
Thanks in advance,
Paul