Erro Upload de Arquivo

Amigons,

Tô usando um código pronto da revista Java Magazine que faz o upload de arquivo, já criei a página que solicitará o servlet com o campo file “tudo direitinho” e na chamada deste ocorre o seguinte erro:

Erro gerado pelo servlet uploadArquivoServlet

[code]javax.servlet.ServletException: Error instantiating servlet class net.itambe.uploadArquivoServlet
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
java.lang.Thread.run(Thread.java:534)

java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Class.java:1618)
java.lang.Class.getConstructor0(Class.java:1930)
java.lang.Class.newInstance0(Class.java:278)
java.lang.Class.newInstance(Class.java:261)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
java.lang.Thread.run(Thread.java:534)
[/code]

Página que chama o servlet

[code]

Upload de Arquivo

Upload de Arquivo

Seu nome:
Localização do Arquivo:

[/code]

Fonte do Servlet

[code]package net.itambe;

import java.io.;
import java.util.
;
import javax.servlet.;
import javax.servlet.http.
;
import org.apache.commons.fileupload.*;

public class uploadArquivoServlet extends HttpServlet{

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	PrintWriter out = response.getWriter();
	if(FileUpload.isMultipartContent(request)){
		String usuario = null;
		DiskFileUpload upload = new DiskFileUpload();
		
		Iterator iterator = null;
		
		try{
			iterator = upload.parseRequest(request).iterator();
		}catch(FileUploadException exc){
			exc.printStackTrace();
			out.println("Erro processamento submissão: " + exc.getMessage());
			return;
		}
		while(iterator.hasNext()){
			FileItem item = (FileItem) iterator.next();
			boolean isFormField = item.isFormField();
			if(isFormField){
				if(item.getFieldName().equalsIgnoreCase("nome")){
					usuario = item.getString() == null ? "" : " " + item.getString();
				}
			}else{
				String nomeArquivo = item.getName();
				String path = getServletContext().getRealPath("/") + "WEB-INF/files/" + nomeArquivo;
				try{
					File file = new File(path);
					item.write(file);
					out.println("Obrigado" + usuario + " pela submissão.<br>");
					out.println("O arquivo foi gravado em " + path + ".");
				}catch(Exception exc){
					out.println("Erro gravando arquivo: " + exc.getMessage());
				}
			}
		}
	}else{
		out.println("Erro: página não pode ser acessada diretamente!");
	}
}

}
[/code]

… já me falaram que o commons-fileupload.jar não está no classpath da aplicação web, e que para funcionar basta colocar este pacote dentro de WEB-INF/lib, mas está no WEB-INF/lib e no server/lib

Alguém sabe o que tá acontecendo ?

Valeuh!

Voce colocou os arquivos .class descompactados no diretorio lib, quando deveria ter colocado no diretorio “classes”. No lib devem ir somente arquivos .jar

Rafael

Cara! era isso mesmo! coloquei o pacote do fileUpload descompactado no diretório classes … ai rolou! mas essa é a forma mais correta a fazer ?

… só que agora tá entrando numa Exception … e como eu tratei dá uma olhada na mensagem que tá aparecendo …

Erro gravando arquivo: c:\Tomcat\webapps\pc\WEB-INF\files\C:\Documents and Settings\Ronies\Desktop\file.txt (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)

ele naum tá pegando o nome do arquivo e sim do caminho inteiro !!!

???

O correto nesse caso seria nao descompactar o .jar, e colocar ele no lib.
O problema ao salvar o arquivo em disco eh pq, qdo vc usa IE, ele envia como nome do arquivo o path completo, enquanto o Firefox envia apenas o nome do arquivo em si. Logo, item.getName(), qdo usado via IE, vai retornar o nome do arquivo com o path completo que ele estava no teu PC, enquanto no firefox vc vai ter apenas o desejado, ou seja, o nome do arquivo em si.
A solucao eh splitar e pegar apenas a parte que interessa. No JForum eu faco assim:

// Gets only the filename, without the path (IE does that)
String realName = item.getName();
String separator = "/";
int index = realName.indexOf(separator);

if (index == -1) {
	separator = "\\";
	index = realName.indexOf(separator);
}

if (index > -1) {
	if (separator.equals("\\")) {
		separator = "\\\\";
	}
	
	String[] p = realName.split(separator);
	realName = p[p.length - 1];
}

“realName” vai ter agora o nome correto do arquivo.

Rafael