Erro Upload de Arquivo

3 respostas
rcmsj

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
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)
Página que chama o servlet
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Upload de Arquivo</title>
</head>
<body bgcolor="#FFFFFF">
	<h1>Upload de Arquivo</h1>
	<form action="/pc/uploadArquivoServlet" method="post" enctype="multipart/form-data">
		Seu nome: <input type="text" name="nome"><br>
		Localização do Arquivo: <input type="file" name="arquivo"><br><br>
		<input type="submit" name="submit" value="Enviar">
	</form>
</body>
</html>
Fonte do Servlet
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!");
		}
	}
}

... 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

[img]http://www.aracaticity.kit.net/temp/img_fupload.jpg[/img]

Alguém sabe o que tá acontecendo ?

Valeuh!

3 Respostas

Rafael_Steil

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

Rafael

rcmsj

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 !!!

???

Rafael_Steil

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

Criado 24 de fevereiro de 2005
Ultima resposta 25 de fev. de 2005
Respostas 3
Participantes 2