Does it also work with an array (does not need an index)?
In the ActionBean:
@Validate
public FileBean[] files;
In the JSP:
<stripes-dynamic:file id="files" name="files[]" multiple="multiple"/>
Cheers,
--
Samuel Santos
http://www.samaxes.com/
On Thu, Jan 12, 2012 at 7:57 PM, Mike McNally <emmecin...@gmail.com> wrote:
> whoa that's awesome ... I'll def. give that a try.
>
> Thanks!!!
>
> On Thu, Jan 12, 2012 at 1:19 PM, Poitras Christian
> <christian.poit...@ircm.qc.ca> wrote:
> > Hi,
> >
> > I've managed to create a workarounf for this a while ago.
> > I thought about adding it to StripesStuff project, but it would be
> better if it was in Stripes itself.
> > I think it would be easy to change it so that we won't need to add a
> "[0]" at the end of the name element.
> >
> > In the ActionBean:
> > @Validate
> > public List<FileBean> files;
> >
> > In the JSP:
> > <stripes-dynamic:file id="files" name="files[0]" multiple="multiple"/>
> >
> > You need a new
> net.sourceforge.stripes.controller.multipart.CommonsMultipartWrapper.
> > @SuppressWarnings("unchecked")
> > public void build(HttpServletRequest request, File tempDir, long
> maxPostSize)
> > throws IOException, FileUploadLimitExceededException {
> > String charset;
> > Map<String,FileItem> files = new HashMap<String,FileItem>();
> > Map<String,String[]> parameters = new HashMap<String, String[]>();
> >
> > try {
> > charset = request.getCharacterEncoding();
> > DiskFileItemFactory factory = new DiskFileItemFactory();
> > factory.setRepository(tempDir);
> > ServletFileUpload upload = new ServletFileUpload(factory);
> > upload.setSizeMax(maxPostSize);
> >
> > List<FileItem> items = upload.parseRequest(request);
> > Map<String,List<String>> params = new HashMap<String,
> List<String>>();
> >
> > for (FileItem item : items) {
> > // If it's a form field, add the string value to the list
> > if (item.isFormField()) {
> > List<String> values = params.get(item.getFieldName());
> > if (values == null) {
> > values = new ArrayList<String>();
> > params.put(item.getFieldName(), values);
> > }
> > values.add(charset == null ? item.getString() :
> item.getString(charset));
> > }
> > // Else store the file param
> > else {
> > processFile(item, files);
> > }
> > }
> >
> > // Now convert them down into the usual map of
> String->String[]
> > for (Map.Entry<String,List<String>> entry :
> params.entrySet()) {
> > List<String> values = entry.getValue();
> > parameters.put(entry.getKey(), values.toArray(new
> String[values.size()]));
> > }
> > }
> > catch (FileUploadBase.SizeLimitExceededException slee) {
> > throw new FileUploadLimitExceededException(maxPostSize,
> slee.getActualSize());
> > }
> > catch (FileUploadException fue) {
> > IOException ioe = new IOException("Could not parse and cache
> file upload data.");
> > ioe.initCause(fue);
> > throw ioe;
> > }
> >
> > try {
> > Field charsetField =
> net.sourceforge.stripes.controller.multipart.CommonsMultipartWrapper.class.getDeclaredField("charset");
> > if (!charsetField.isAccessible()) {
> > charsetField.setAccessible(true);
> > }
> > charsetField.set(this, charset);
> > Field filesField =
> net.sourceforge.stripes.controller.multipart.CommonsMultipartWrapper.class.getDeclaredField("files");
> > if (!filesField.isAccessible()) {
> > filesField.setAccessible(true);
> > }
> > filesField.set(this, files);
> > Field parametersField =
> net.sourceforge.stripes.controller.multipart.CommonsMultipartWrapper.class.getDeclaredField("parameters");
> > if (!parametersField.isAccessible()) {
> > parametersField.setAccessible(true);
> > }
> > parametersField.set(this, parameters);
> > } catch (NoSuchFieldException e) {
> > throw new RuntimeException("Could not set fields in super
> class", e);
> > } catch (IllegalAccessException e) {
> > throw new RuntimeException("Could not set fields in super
> class", e);
> > }
> > }
> > private void processFile(FileItem item, Map<String,FileItem> files) {
> > if (item.getFieldName().endsWith("[0]")
> > && files.containsKey(item.getFieldName())) {
> > String baseName = item.getFieldName().substring(0,
> item.getFieldName().length() - 3);
> > int index = 0;
> > while (files.containsKey(baseName + "[" + index + "]")) {
> > index++;
> > }
> > log.trace("renaming file parameter " + item.getFieldName() +
> " to " + baseName + "[" + index + "]");
> > files.put(baseName + "[" + index + "]", item);
> > } else {
> > files.put(item.getFieldName(), item);
> > }
> > }
> >
> > Christian
> >
> > -----Message d'origine-----
> > De : Mike McNally [mailto:emmecin...@gmail.com]
> > Envoyé : January-12-12 12:25 PM
> > À : Stripes Users List
> > Objet : [Stripes-users] File inputs with the new "multiple" attribute
> >
> > In newer browsers, it's possible to give input elements of type "file"
> > the "multiple" attribute. That tells the browser to allow more than
> > one file to be selected in the file chooser. That, in turn, results in
> > a multi-valued request parameter.
> >
> > When I try this, however, it doesn't work, a situation which I think
> > is documented on the wiki. However that documentation was probably
> > written before the advent of the "multiple" attribute, so the
> > painfulness of the situation was not as evident then (and thus the
> > indexed parameter name solution seemed quite reasonable). There's no
> > way to fix this however; the browser is completely in charge of
> > preparing the POST data.
> >
> > My question is, what is it that would have to be fixed in order to
> > support "multiple" file parameters? The web is moving pretty fast
> > nowadays :-)
> >
> >
> > --
> > Turtle, turtle, on the ground,
> > Pink and shiny, turn around.
> >
> >
> ------------------------------------------------------------------------------
> > RSA(R) Conference 2012
> > Mar 27 - Feb 2
> > Save $400 by Jan. 27
> > Register now!
> > http://p.sf.net/sfu/rsa-sfdev2dev2
> > _______________________________________________
> > Stripes-users mailing list
> > Stripes-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/stripes-users
> >
> >
> ------------------------------------------------------------------------------
> > RSA(R) Conference 2012
> > Mar 27 - Feb 2
> > Save $400 by Jan. 27
> > Register now!
> > http://p.sf.net/sfu/rsa-sfdev2dev2
> > _______________________________________________
> > Stripes-users mailing list
> > Stripes-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/stripes-users
>
>
>
> --
> Turtle, turtle, on the ground,
> Pink and shiny, turn around.
>
>
> ------------------------------------------------------------------------------
> RSA(R) Conference 2012
> Mar 27 - Feb 2
> Save $400 by Jan. 27
> Register now!
> http://p.sf.net/sfu/rsa-sfdev2dev2
> _______________________________________________
> Stripes-users mailing list
> Stripes-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/stripes-users
>
------------------------------------------------------------------------------
RSA(R) Conference 2012
Mar 27 - Feb 2
Save $400 by Jan. 27
Register now!
http://p.sf.net/sfu/rsa-sfdev2dev2
_______________________________________________
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users