Upload de Imagem web - Servlet

6 respostas
1

Boa tarde Galera,

Tenho o seguinte código.
Index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Exemplo de upload</title>
    </head>
    <body>
     <p>Commons File Upload Example</p>
		&lt;form action="upload.jsp" enctype="multipart/form-data" method="POST"&gt;
			&lt;input type="file" name="file1"&gt;<br>
			&lt;input type="Submit" value="Upload File"&gt;<br>
		&lt;/form&gt;


    &lt;/body&gt;
&lt;/html&gt;

upload.jsp

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%@ page  
       import="java.io.*"   
       import="java.util.*"   
       import="org.apache.commons.fileupload.*"  
       contentType="text/plain"  
    %&gt;&lt;%  
       boolean isMultipart = FileUpload.isMultipartContent(request);  
       if (isMultipart) {  
          // Create a new file upload handler  
          DiskFileUpload upload = new DiskFileUpload();  
            
          // Set upload parameters  
          upload.setSizeMax(50*1024*1024); //50Mb  
          upload.setRepositoryPath("c:/temp");  
            
          // Parse the request  
          List items = upload.parseRequest(request);  
            
          Iterator it = items.iterator();  
          while (it.hasNext()) {  
             FileItem fitem = (FileItem) it.next();  
             if (!fitem.isFormField()) {  
    %&gt;&lt;%= fitem.getName() %&gt; - &lt;%= fitem.getSize() %&gt; bytes  
    &lt;%  
             }  
          }  
       }  
    %&gt;  



&lt;/body&gt;
&lt;/html&gt;

Bibliotecas no meu lib.
commons-fileupload-1.2.2.jar
commons-io-2.4.jar

Não funciona o upload.
Diz que tem um erro aqui.

An error occurred at line: 14 in the jsp file: /upload.jsp
FileUpload cannot be resolved
11:        import="org.apache.commons.fileupload.*"  
12:        contentType="text/plain"  
13:     %&gt;&lt;%  
14:        boolean isMultipart = FileUpload.isMultipartContent(request);  
15:        if (isMultipart) {  
16:           // Create a new file upload handler  
17:           DiskFileUpload upload = new DiskFileUpload();

Estou precisando muito da ajuda de vocês.
Valeu!

Wesley Martins.

6 Respostas

C

Provavelmente você esta com problema no seu classpath pois ele não esta encontrando a classe FileUpload.

Confira isso ou siga este tutorial aqui, que é bem simples mas funciona muito bem: http://www.coffeecode.com.br/upload-de-arquivos-com-java/

1

crisaltmann

Valeu pela resposta.
O burro aqui, não tinha adicionado as bibliotecas ao classpath.
Funcionou d+++.
Você não tem noção o quanto tentei fazer isso.

Agora, eu to precisando terminar esse código.
Primeiro, no meu código. Tive que trocar

upload.setRepositoryPath("c:/temp");

para

upload.setRepositoryPath("/home/kde/file");

Sendo a pasta file, criada por mim.
Quando eu envio o formulário, abri a pasta e tem lá um arquivo, com extensão temp.
Depois, ele some, quando fecho a página.

Como eu faço para essa pasta ser tipo um padrão.
Porque aqui, utilizamos linux. Em ambiente de produção, como vai ficar?

Agora, eu preciso saber, se está imagem está sendo salva? e onde?
Tem como vc me ajudar nisso.

Tem mais uma coisinha.

A página upload.jsp.
Ta abrindo assim…
Mostrando as tags html.

&lt;html&gt;
&lt;head&gt;  
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;  
&lt;title&gt;Insert title here&lt;/title&gt;  
&lt;/head&gt;  
 &lt;body&gt;  
 
        Nome do arquivo User.xml - 77600 bytes    
            
&lt;/body&gt;  
&lt;/html&gt;

Tem ideia do que séria isso?
Valeu pela ajuda.

1

Consegui!!!

Com o tutorial que vc me mandou olhar.
Lá tinha a resposta.
Ficou só uma questão.

No meu arquivo, eu comentei essa página do código.
Onde eu creio que seria o local do meu path.
E o código funcionou. Será que em ambiente de produção. Teria algum problema?

// upload.setRepositoryPath("/home/kde/file");

Estou postando aqui, como ficou o meu código para ajudar quem precisar fazer a mesma coisa.
Claro que vou transpor esse código para a minha servlet.
Torcer para não dar pau. E rodar tudo certinho.

Página index.jsp
Tem um formulário simples. Com apenas um campo file para fazer o upload.

&lt;%@ page language="java" contentType="text/html; charset=utf-8"  
        pageEncoding="utf-8"%&gt;  
    &lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;  
    &lt;html&gt;  
        &lt;head&gt;  
            &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;  
            &lt;title&gt;Exemplo de upload&lt;/title&gt;  
        &lt;/head&gt;  
        &lt;body&gt;  
         <p>Commons File Upload Example</p>  
            &lt;form action="upload.jsp" enctype="multipart/form-data" method="POST"&gt;  
                &lt;input type="file" name="file1"&gt;<br>  
                &lt;input type="Submit" value="Upload File"&gt;<br>  
            &lt;/form&gt;  
      
      
        &lt;/body&gt;  
    &lt;/html&gt;

Agora, vem a classe upload.jsp

&lt;%@ page    
 import="java.io.*"     
 import="java.util.*"     
 import="org.apache.commons.fileupload.*"    
contentType="text/plain"
%&gt;&lt;%    
           boolean isMultipart = FileUpload.isMultipartContent(request);    
           if (isMultipart) {    
              // Create a new file upload handler    
              DiskFileUpload upload = new DiskFileUpload();    
                  
              // Set upload parameters    
              upload.setSizeMax(50*1024*1024); //50Mb    
            
                  
              // Parse the request    
              List items = upload.parseRequest(request);    
                  
              Iterator it = items.iterator();    
              while (it.hasNext()) {    
                 FileItem fitem = (FileItem) it.next();    
                 if (!fitem.isFormField()) { 
                         //pasta onde sera salva a sua imagem + hora + nome da imagem.
                	 File uploadedFile = new File("/home/kde/file/"+new Date().getTime()+"_"+fitem.getName());
                         //Comando para gravar a imagem
                	 fitem.write(uploadedFile);
        %&gt;
                         //Mostrando o nome do arquivo e o tamanho.
        Nome do arquivo&lt;%= fitem.getName() %&gt; - &lt;%= fitem.getSize() %&gt; bytes    
        &lt;%    
        
                 }    
              }    
           }    
        %&gt;
1

Bom dia Galera,
Agora o problema está na servlet.

&lt;form action="mvc" method="post" enctype="multipart/form-data"&gt;
&lt;input type="hidden" name="logica" value="AdicionaSistema"/&gt;
Nome Sistema: &lt;input type="text" name="nome" /&gt; <br />
Descrição do Sistema: &lt;input type="text" name="descricao" /&gt;<br />
Ativo? &lt;input type=radio name="ativo" value="1"&gt; Sim   &lt;input type=radio name="ativo" value="0"&gt; Não<br></br>
Url &lt;input type="text" name="url" /&gt;<br />
Imagem do Sistema &lt;input type="file" name="imagem"/&gt;<br />
&lt;input type="submit" value="Gravar" /&gt;
&lt;/form&gt;

Como vcs podem ver. Utilizo, uma servlet que recebe o metodo, e manda para a servlet especificada.

&lt;input type="hidden" name="logica" value="AdicionaSistema"/&gt;

Minha mvc está assim.

protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,
	IOException{
		String parametro = request.getParameter("logica");
		String nomeDaClasse = "br.com.softsolweb.servlet."+ parametro;
		try{
			Class classe = Class.forName(nomeDaClasse);
			
			Logica logica = (Logica) classe.newInstance();
			logica.executa(request, response);
		}catch (Exception e){
			throw new ServletException("A lógica de negócios causou uma exceção ",e);
			}
		}

Minha AdicionaSistema.

public void executa(HttpServletRequest request, HttpServletResponse response)
				throws Exception {
			
			Sistemas sistemas = new Sistemas();
			//montando o objeto
			sistemas.setNome(request.getParameter("nome"));
			sistemas.setAtivo(request.getParameter("ativo"));
			sistemas.setDescricao(request.getParameter("descricao"));
			
			//Adicionando imagem.
			boolean isMultipart = FileUpload.isMultipartContent(request);    
	           if (isMultipart) {    
	              // Create a new file upload handler    
	              DiskFileUpload upload = new DiskFileUpload();    
	                  
	              // Set upload parameters    
	              upload.setSizeMax(50*1024*1024); //50Mb    
	             // upload.setRepositoryPath("/home/kde/file");    
	                  
	              // Parse the request    
	              List items = upload.parseRequest(request);    
	                  
	              Iterator it = items.iterator();    
	              while (it.hasNext()) {    
	                 FileItem fitem = (FileItem) it.next();    
	                 if (!fitem.isFormField()) {    
	                	 File uploadedFile = new File("/home/kde/file/"+new Date().getTime()+"_"+fitem.getName());
	                	 fitem.write(uploadedFile);
	                	 System.out.println("Nome do arquivo: " + fitem.getName() + " -  "  + fitem.getSize() + "bytes");
	                	 //sistemas.setImagem(fitem.getName());
	                }    
	              }    
	           }    
	           				sistemas.setUrl(request.getParameter("url"));
			
			//DAO
			SistemasDAO dao = new SistemasDAO();
			dao.adiciona(sistemas);
			RequestDispatcher rd = request.getRequestDispatcher("/sucesso/adicionadosucesso.jsp");
			rd.forward(request, response);
			
		}

Quando eu utilizo.

enctype="multipart/form-data"

Dá o seguinte erro.

A lógica de negócios causou uma exceção

e

br.com.softsolweb.servlet.null

Como se eu não tivesse enviado o parametro logica preenchido.

Já quando eu retiro.

enctype="multipart/form-data"

Dá o seginte erro.

A lógica de negócios causou uma exceção

Claro né.
e

Column 'imagemsistemas' cannot be null

Pelo que eu entendi, quando eu estou utilizando o enctype, a minha mvc não consegue ler o meu hidden.
E quando retiro, a minha imagem não está ‘chegando’ na minha AdicionaSistema.

Vocês poderiam a me ajudar.
Sei que é uma besteirinha de nada.

Já está quase pronto o sistema.
Fiz todo em jsp, servlet.
Ficou muito bom.
Só falta enviar a imagem.
Outra coisa, to salvando a imagem em uma pasta, e o nome do arquivo no banco. Para depois recuperar.

sistemas.setImagem(fitem.getName());

Gratos.

C

Cara da uma olhada no mesmo link http://www.coffeecode.com.br/upload-de-arquivos-com-java/

Ali tem como recebe parâmetros que não são multi part.

Para recuperá-los não pode ser simplesmente pelo getParameter. No caso tem um campo texto normal que exemplifica isso.

1

Bom,
Já implementei o código. Mas estacionei aqui.

boolean isMultipart = ServletFileUpload.isMultipartContent(request);
			 	        if(isMultipart) {
			 	            try {
			 	                FileItemFactory factory = new DiskFileItemFactory();
			 	                ServletFileUpload upload = new ServletFileUpload(factory);
			 	                List&lt;FileItem&gt; items = (List&lt;FileItem&gt;)upload.parseRequest(request);
			 	                for(FileItem item : items) {
			 	                    if(item.isFormField()) {
			 	                    	//se for um campo normal de form
			 	                    sistemas.setNome(item.getFieldName());
			 	           			sistemas.setAtivo(item.getFieldName());
			 	           			sistemas.setDescricao(item.getFieldName());
			           				sistemas.setUrl(item.getFieldName());

			 	                        
			 	                    } else {
			 	                        //caso seja um campo do tipo file
			 	                         File uploadedFile = new File("/home/kde/file/"+new Date().getTime()+"_"+item.getName());
			 		                	 item.write(uploadedFile);
			 		                	 System.out.println("Nome do arquivo: " + item.getName() + " -  "  + item.getSize() + "bytes");
			 		                	 sistemas.setImagem(fitem.getName());
			 	                    }
			 	                }
			 	            } catch (Exception e) {
			 	                response.getWriter().println("ocorreu um problema ao fazer o upload: " + e.getMessage());
			 	            }
			 	 
			 	        }
			 	
			
			//DAO
			SistemasDAO dao = new SistemasDAO();
			dao.adiciona(sistemas);
			RequestDispatcher rd = request.getRequestDispatcher("/sucesso/adicionadosucesso.jsp");
			rd.forward(request, response);
			
		}

Pelo que entendi, vamos fazer uma listagem de todos os campos do meu form.
Mas como eu vou saber, quem é quem?

E para finalizar, o erro que mais gosto do apache.

A lógica de negócios causou uma exceção 

Column 'nomesistemas' cannot be null

Realmente a coluna nomesistemas não pode ser nula.rsrs.
Teria como vocês me ajudar com isso.
Preciso disso urgente.

Valeu.
Wesley Martins.

Criado 20 de agosto de 2012
Ultima resposta 22 de ago. de 2012
Respostas 6
Participantes 2