Tentativa de Fazer um upload de arquivo

Olá estou tentando fazer um upload de arquivo usando jakarta Commons FileUpload 1.2. Já adicionei esse pacote dentro de WEB-INF/lib porém dá um erro que não consigo explicar.

Primeira vez que posto no GUJ espero ser bem recebido :smiley:

Vamos aos códigos

[code]import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet
{

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	 DiskFileItemFactory factory = new DiskFileItemFactory();
     // maximum size that will be stored in memory
     factory.setSizeThreshold(4096);
     // the location for saving data that is larger than getSizeThreshold()
     factory.setRepository(new File("/tmp"));

     ServletFileUpload upload = new ServletFileUpload(factory);
     // maximum size before a FileUploadException will be thrown
     upload.setSizeMax(1000000);

    List fileItems;
	try 
	{
		fileItems = upload.parseRequest(request);
		Iterator i = fileItems.iterator();
		
	    String comment = ((FileItem)i.next()).getString();
	    FileItem fi = (FileItem)i.next();
	    // filename on the client
	    String fileName = fi.getName();
	    // save comment and filename to database
	     
	    // write the file
	    fi.write(new File("/data/", fileName));
	} catch (FileUploadException e) 
	{
		e.printStackTrace();
	}
	catch (Exception e) 
	{
		e.printStackTrace();
	}

}

}
[/code]

O jsp que envia para esse servlet é:

<form action="/upload" method="post" enctype="multipart/form-data">
<table> 
<tr>
	<td>Selecione uma imagem para fazer o upload: <input type="file" name="filename"> <input type="submit" value="upload"></td>
</tr>
</table>
</form>

o erro que acontece é esse

SEVERE: Servlet.service() for servlet UploadServlet threw exception
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream

exatamente quando ele tenta executar
fileItems = upload.parseRequest(request);

Quando ocrre erro de NoClassDefFoundError, é pq a classe não foi encontrada, então, verifica se a sua classpath está configurada corretamente e se vc adicionou os jars corretamente na sua aplicação.

Exatamente verifique se esses jars estão no seu classpath:

commons-fileupload-1.2.jar
commons-io-1.3.1.jar

Eu coloquei no WEB-INF/lib pensei que resolvesse…

colocar no meu classpath o .jar seria coloca-lo aqui?

C:\Arquivos de programas\Java\jre1.5.0_08\lib

eu não tenho esse commons-io

vou precisar dele???

Adicionei o meu . jar em variáveis de sistema, mas o mesmo erro continua acontecendo

CLASSPATH=.;%CLASSPATH%;C:\Arquivos de programas\Java\jre1.5.0_08\lib\commons-fileupload-1.2.jar

se alguém puder me dar uma ajuda em como eu coloco esse jar para ele reconhecer no classpath por favor me fale

Vai precisar sim, faça o download aqui:

apenas dentro do WEB-INF/lib deve resolver.

Se você já colocou, verifique se a exception é a mesma

Caso não resolva colocar o JAR na WEB-INF/lib , coloque tbm na commons/lib

Pedrosa muito obrigado. Realmente estava faltando esse outro .jar.

Coloquei os dois jar’s no WEB-INF/lib e funcionou, porém aquela classe que usei não deu certo. Vou postar o meu servlet atual que achei na internet que está funcionando corretamente.

Porém há duas falhas nele.

Uma que o getServletContext().getRealPath("/data/");

retorna esse caminho C:\Documents and Settings\Juan Carlos\Desktop\Juan\eclipse_Lomboz\Meus Projetos.metadata.plugins\org.eclipse.wst.server.core\tmp0\webapps\Nova_OJK\data

quando eu queria que retornasse esse

C:\Documents and Settings\Juan Carlos\Desktop\Juan\eclipse_Lomboz\Meus Projetos\Nova_OJK\WebContent\data

estranho não?

segundo que o arquivo que eu fiz o upload só fica visível no sistemas quando eu dou um f5. Queria pegar esse arquivo e adiciona-lo em um rich text editor, mas só fica um X. Apesar da imagem realmente constar lá.

Quem puder me ajudar com alguma dessas outras 2 dúvidas eu agradeço.

<form action="/Nova_OJK/tentativa" method="post" enctype="multipart/form-data">
<table> 
<tr>
	<td>Selecione uma imagem para fazer o upload: 
	<input name="imagem" type="file" accept="image/jpeg; image/gif; image/bmp; image/png" id="imagem" class="dados" tabindex="1">
	<input type="submit" value="upload">
	</td>
</tr>
</table>
</form>
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


 public class UploadServlet3 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet 
 {
     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
     {
         doGet(request, response);
     }
     
	 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	 {   
         FileItemFactory factory = new DiskFileItemFactory();

         ServletFileUpload upload = new ServletFileUpload(factory);

         String formulario = "";

         try 
         {
             List items = upload.parseRequest(request);

             Iterator iter = items.iterator();

             while (iter.hasNext()) 
             {

                 FileItem item = (FileItem) iter.next();

                 if (item.getFieldName().equals("tipoForm")) 
                 {

                     formulario = item.getString();

                 }

                 if (!item.isFormField()) 
                 {

                     if (item.getName().length() > 0) 
                     {

                         this.inserirImagemDiretorio(item);

                     }

                 }

             }
         }
         catch (FileUploadException ex) 
         {
        	 ex.printStackTrace();
	     }
         catch (Exception ex) 
         {
        	 ex.printStackTrace();
	     }
}

	 private void inserirImagemDiretorio(FileItem item) throws IOException 
	 {
		 	//FIXME Estou colocando o caminho completo que não é aconselhável, consertar para pegar de acordo com o projeto
		 	// getServletContext().getRealPath("/");
			String caminho = "C:\\Documents and Settings\\Juan Carlos\\Desktop\\Juan\\eclipse_Lomboz\\Meus Projetos\\Nova_OJK\\WebContent\\data";
			
			// Cria o diretório caso ele não exista
			File diretorio = new File(caminho);
			
			if (!diretorio.exists())
			{
				diretorio.mkdir();
			
			}
			
			// Mandar o arquivo para o diretório informado
			String nome = item.getName();
			String arq[] = nome.split("\\\\");
			
			for (int i = 0; i < arq.length; i++) 
			{
				nome = arq[i];
			}
			
			File file = new File(diretorio, nome);
			FileOutputStream output = new FileOutputStream(file);
			InputStream is = item.getInputStream();
			byte[] buffer = new byte[2048];
			
			int nLidos;
			
			while ((nLidos = is.read(buffer)) >= 0) 
			{
				output.write(buffer, 0, nLidos);
			}
			output.flush();
			output.close();
	 }
}

Ninguém? :cry:

O que ocorreu desta vez é que você está rodando dentro do Eclipse, correto?
Faça um WAR file e depois o deploy em seu servidor.

[]'s