Jakarta Commons FileUpload + NetBeans 6.0.1 - Mais de duas semanas tentando fazer um Upload

Salve pessoal, eu tô há quase 3 semanas tentando fazer um upload simples de um arquivo(imagem jpeg) de 30kb usando o jakarta commons fileupload. Estou usando o Netbeans 6.0.1.

No início quando eu tentava importar o commons fileupload a linha ficava com aquele sublinhado vermelho dizendo que não achou as classes.
Daí eu fui em; Ferramentas > Bibliotecas, na janela eu clico em “Nova Biblioteca”, dou um nome qualquer pra nova biblioteca, seleciono “Blbliotecas de Classe” e dou OK.

No “classpath” eu coloco o caminho do arquivo “commons-fileupload-1.2.1.jar”
No Códigos-Fonte(sources) eu ponho o caminho do arquivo “commons-fileupload-1.2.1-sources.jar”
Clico em OK.

No meu projeto eu clico com o direito em “Bibliotecas” > “Adicionar Biblioteca”, vai se abrir uma lista com todas as bibliotecas e a minha nova biblioteca está lá entre elas, adiciono ela. À partir daí eu já consigo importar as classes e acabam-se os erros no netbeans.

Aí vou executar o projeto e me é mostrada essa exceção;

HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.

exception
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:541)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause
javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.teste_jsp._jspService(teste_jsp.java:87)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:196)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:358)
org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
classes.geral.executaUpload(geral.java:306)
org.apache.jsp.teste_jsp._jspService(teste_jsp.java:60)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.
Apache Tomcat/6.0.14

Aí eu ponho esses dois .jar na pasta /web//WEB-INF/lib/ (no mesmo lugar onde tá o meu jar de conexão com o oracle que funciona), e me continua sendo mostrada essa exceção.

Por enquanto eu nem tentei fazer o upload porque quando chega na linha

List items = upload.parseRequest(request); já dá erro.

Eu criei o seguinte método só pra testar e me retornar o nome do arquivo que foi postado pelo formulário;

    public static String executaUpload(HttpServletRequest request) throws ServletException, IOException {
            String res = "";
            if (FileUpload.isMultipartContent(request)) {
                
                FileItemFactory factory  = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String local             = new String("/home/leogazio");
                upload.setSizeMax(2 * 1024 * 1024);
                
               try {
                    List items = upload.parseRequest(request);
                    Iterator iter = items.iterator();
                    while (iter.hasNext()) {
                        FileItem fitem = (FileItem) iter.next();
                        res += fitem.getName();
                    }
                
                } catch(FileUploadException e) {
                    e.printStackTrace();
                } catch(Exception e) {
                    e.printStackTrace();
                }

            }
        
        return res;
    }

Se eu comentar o scopo do try não me é retornada nenhuma exceção;

Agora vem a parte que eu acho engraçada;
Essa parte do códico usa o commons fileupload e além de NÃO me dá exceção funciona porque se eu tirar o parâmetro enctype da tag do form html a seguinte condição retorna false e se eu colocar o enctype como multipart/form-data ela retorna true;

if (FileUpload.isMultipartContent(request)) { 
res = "É Multipart";
} else {
res = "NÃO é Multipart";
}

A pergunta agora é: Por que essa condição que usa o commons fileupload funciona e o List não? Se alguém souber como proceder pra fazer isso funcionar, desde os import lá em cima até o final… Já li vários tutoriais e nenhum funcionou, aqui no GUJ eu já li todos e nada, a exceção continua quando chega no List…

Um abraço à todos os colegas aqui e qualquer ajuda será bemvinda, []'s.

Instale o commons-io, conforme a versão descrita pela documentação

Fala aí Aldrin, cara eu já fiz tudo o que esse site do projeto jakarta mostra, afinal são 2(duas) semanas né cara, essa sua resposta aí eu já vi em vários lugares antes de eu pensar em abrir esse tópico. Agora de uma coisa você pode ter certeza, têm certas coisas dores de cabeça que eu nunca tive no PHP e tô tendo com o JAVA, eu nunca pensei que um dia eu chegaria a levar 2 semanas tentando fazer um simples upload. Afinal, JAVA é futuro ou dor de cabeça?

Obrigado aí pela sua ajuda cara e um abraço.

Vcs tiveram resposta para isso. tô com o mesmo problema dá dando erro na mesma linha.

vlw!!

Descobri o erro…

Tetem retirar a path antiga. deixa só a mais atual e dê um Clean no projeto…

Aqui funcionou

vlw!

Cara,

Se vc tá usando o NetBeans, penso mais fácil fazer assim:

import com.sun.rave.web.ui.model.UploadedFile
import com.sun.rave.web.ui.component.Upload;

Depois bota isso num botão

public String uploadFileButton_action() {
        // TODO: Processar o botão de ação clicar. O valor de retorno é um nome de caso
        // de navegação em que nulo fará retornar para a mesma página.
        UploadedFile uploadedFile = fileUpload1.getUploadedFile();
        String uploadedFileName = uploadedFile.getOriginalName();
        // Some browsers return complete path name, some don't
        // Make sure we only have the file name
        // First, try forward slash
        int index = uploadedFileName.lastIndexOf('/');
        String justFileName;
        if ( index >= 0) {
            justFileName = uploadedFileName.substring( index + 1 );
        } else {
            // Try backslash
            index = uploadedFileName.lastIndexOf('\\');
            if (index >= 0) {
                justFileName = uploadedFileName.substring( index + 1 );
            } else {
                // No forward or back slashes
                justFileName = uploadedFileName;
            }
        }
        this.fileNameStaticText.setValue(justFileName);
        Long uploadedFileSize = new Long(uploadedFile.getSize());
        this.fileSizeStaticText.setValue(uploadedFileSize + " bytes");
        String uploadedFileType = uploadedFile.getContentType();
        this.fileTypeStaticText.setValue(uploadedFileType);
        if ( uploadedFileType.equals("image/jpeg")
        || uploadedFileType.equals("image/pjpeg")
        || uploadedFileType.equals("image/gif")
        || uploadedFileType.equals("image/png")
        || uploadedFileType.equals("image/x-png")) {
            try {
                File file = new File(this.realImageFilePath);
                uploadedFile.write(file);
                //byte[] img = uploadedFile.getBytes();
                //String res = Miniatura.redim(realImageFilePath, img);
                //error(res);
            } catch (Exception ex) {
                error("Foi impossível enviar o arquivo: " + justFileName);
            }
        } else {
            error("Você deve enviar um arquivo do tipo JPEG, PJPEG, GIF, PNG, ou X-PNG file.");
            new File(this.realImageFilePath).delete();
        }
        return null;
    }