Problema com upload (commons.fileupload)

olá, eu estou tendo problemas em como realizar o upload de arquivos utilizando o fileupload

eu criei uma página bem simples apenas para selecionar o arquivo e submeter:

&lt;html&gt; &lt;head&gt; &lt;title&gt;JSP Page&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form method="post" action="MeuServlet" enctype="multipart/form-data"&gt; &lt;input type="file" name="file1"/&gt;<br/> &lt;input type="file" name="file2"/&gt;<br/> &lt;input type="file" name="file3"/&gt;<br/> &lt;input type="submit" value="Enviar dados" /&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;

e daew no MeuServlet, eu apliquei este padrão segundo o JDoc descrito por lá

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            if (isMultipart) {
                System.out.println("É mult Parte !!!!");
                out.println("&lt;html&gt;");
                out.println("&lt;head&gt;");
                out.println("&lt;title&gt;Servlet AIO&lt;/title&gt;");
                out.println("&lt;/head&gt;");
                out.println("&lt;body&gt;");
                out.println("&lt;h1&gt;Servlet AIO at " + request.getContextPath() + "&lt;/h1&gt;");
                out.println("É mult Parte !!!!</br>");

                // Create a factory for disk-based file items
                ServletFileUpload upload = new ServletFileUpload();

// Parse the request
                FileItemIterator iter = null;
                try {
                    iter = upload.getItemIterator(request);
                } catch (FileUploadException ex) {
                    Logger.getLogger(AIO.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    while (iter.hasNext()) {
                        FileItemStream item = iter.next();
                        String name = item.getFieldName();
                        InputStream stream = item.openStream();

                        if (item.isFormField()) {
                            System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected.");
                            out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected.<br/>");
                        } else {
                            System.out.println("File field " + name + " with file name " + item.getName() + " detected.");
                            out.println("File field " + name + " with file name " + item.getName() + " detected, formato: "+item.getContentType()+".<br/>");
                            
                            
                            FileItem item2 = (FileItem)item;
                            File uploadFile = new File("C:\\temp\\"+name);
                            try {
                                item2.write(uploadFile);
                            } catch (Exception ex) {
                                Logger.getLogger(AIO.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                } catch (FileUploadException ex) {
                    Logger.getLogger(AIO.class.getName()).log(Level.SEVERE, null, ex);
                }
                out.println("&lt;/body&gt;");
                out.println("&lt;/html&gt;");
            } 
        } finally {
            out.close();
        }
    }

dando o erro:

java.lang.ClassCastException: org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl cannot be cast to org.apache.commons.fileupload.FileItem at Servlet.AIO.processRequest(AIO.java:83) at Servlet.AIO.doPost(AIO.java:155) at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:431) at org.apache.catalina.core.StandardWrapperValve.preInvoke(StandardWrapperValve.java:462) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:139) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:186) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:96) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:187) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:142) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:242) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180) at com.sun.grizzly.http.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:633) at com.sun.grizzly.http.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:570) at com.sun.grizzly.http.DefaultProcessorTask.process(DefaultProcessorTask.java:827) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:152) at com.sun.enterprise.v3.services.impl.GlassfishProtocolChain.executeProtocolFilter(GlassfishProtocolChain.java:71) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:103) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:89) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:67) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:56) at com.sun.grizzly.util.WorkerThreadImpl.processTask(WorkerThreadImpl.java:325) at com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:184)

mas pelo que eu vi, a ferramenta conseguia converter FileItemStream para FileItem para depois eu poder realizar o upload, mas isso no caso não está acontecendo no código pelo que percebi

resolvi o meu problema!

segue o código:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            if (isMultipart) {
                System.out.println("É mult Parte !!!!");
                out.println("&lt;html&gt;");
                out.println("&lt;head&gt;");
                out.println("&lt;title&gt;Servlet AIO&lt;/title&gt;");
                out.println("&lt;/head&gt;");
                out.println("&lt;body&gt;");
                out.println("&lt;h1&gt;Servlet AIO at " + request.getContextPath() + "&lt;/h1&gt;");
                out.println("É mult Parte !!!!</br>");

                // Create a factory for disk-based file items
                ServletFileUpload upload = new ServletFileUpload();

// Parse the request
                FileItemIterator iter = null;
                try {
                    iter = upload.getItemIterator(request);
                } catch (FileUploadException ex) {
                    Logger.getLogger(AIO.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    while (iter.hasNext()) {
                        FileItemStream item = iter.next();
                        String name = item.getFieldName();
                        InputStream stream = item.openStream();

                        if (item.isFormField()) {
                            System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected.");
                            out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected.<br/>");
                        } else {
                            System.out.println("File field " + name + " with file name " + item.getName() + " detected.");
                            out.println("File field " + name + " with file name " + item.getName() + " detected e com tamanho: " + item.getContentType() + ".<br/>&quot;);
                            File file = new File(&quot;C:\\temp&quot;, item.getName());
                            FileOutputStream output = new FileOutputStream(file);
                            byte[] buffer = new byte[2048];
                            int nLidos;
                            while ((nLidos = stream.read(buffer)) &gt;= 0) {
                                output.write(buffer, 0, nLidos);
                            }
                            output.flush();
                            output.close();
                        }
                    }
                } catch (FileUploadException ex) {
                    Logger.getLogger(AIO.class.getName()).log(Level.SEVERE, null, ex);
                }
                out.println(&quot;&lt;/body&gt;");
                out.println("&lt;/html&gt;");
            }
        } finally {
            out.close();
        }
    }

agora eu queria saber se alguém pode me ajudar como fazer uma barra de progresso do upload, att!