Upload de arquivos com Servlet

8 respostas
J

Já procurei aqui no GUJ e no Google, mas não consegui achar nada que funcionasse para fazer upload… o que estou fazendo é isso:

Tenho uma página com um

Quero saber como pegar o arquivo ,através de um Servlet, que o usuário enviar e salvar no servidor?

É preciso alguma biblioteca extra?

8 Respostas

jeroqueiroz

Veja se te serve de referencia.

package meupacote;

import java.io.File;
import java.util.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletContext;
import javax.servlet.http.*;

public class UploadBean {

	private DiskFileItemFactory fileUpload = new DiskFileItemFactory();
    private ServletFileUpload sfu = new ServletFileUpload(fileUpload);

    private String diretorio;
    private String filename;
    private static int KB = 1024;
    private static int MB = 1024 * 1024;
    private int size;
    private String extensoesPermitidas;
	    
    private String erro=null;
    
	public void setDiretorio(String diretorio) {
		this.diretorio = diretorio;
	}

	public String getDiretorio() {
		return diretorio;

	}	    	        

	public String getFilename() {
		return filename;
	}
	

	public boolean doFilePost(HttpServletRequest request, ServletContext context) {
            if (request.getContentType() == null){
            	return false;
            }
                

            if (!request.getContentType().startsWith("multipart/form-data"))
            {
            	setErro("Seu formulário não envia arquivos");
                return false;
            }
         
            
            fileUpload.setSizeThreshold(4 * KB);
            
           
            String path = context.getRealPath(getDiretorio());
            try
            {
            	sfu.setSizeMax(getSize() * MB);
            	
                List list = sfu.parseRequest(request);
                

                for (Iterator iterator = list.iterator(); iterator.hasNext();) {
                    FileItem item = (FileItem)iterator.next();

                    if (!item.isFormField()){
                        filename = item.getName();
                        
                        
                        if ((filename != null) && (!filename.equals(""))){
                            
                        	filename = (new File(filename)).getName();
                            
                            if(isPermission(filename)){
                            	item.write(new File(path + "/" + filename));
                            }
                            else{
                            	setErro("Arquivo não permitido");
                            	return false;
                            }
                        }

                    }
                }
                
            }catch(FileUploadBase.SizeLimitExceededException slee){
            	slee.printStackTrace();
            	setErro("Tamanho excedido");
            	return false;
                
            }catch (Exception e) {
            	setErro("Uma Exceção ocorreu: "+e.getMessage());
                e.printStackTrace();
                return false;
            }

            return true;
    }

    


/*
    public boolean isPermission(String fileName)
    {
        String lowerCaseName = fileName.toLowerCase();
        for (int i = 0; i < extensoesPermitidas.length; i++)
        {
            if (lowerCaseName.endsWith(extensoesPermitidas[i]))
                return true;
        }
        return false;
    }
*/
	public void setSize(int size) {
		this.size = size;
	}

	public int getSize() {
		return size;
	}

	private void setErro(String erro) {
		this.erro = erro;
	}

	public String getErro() {
		return erro;
	}

	public void setExtensoesPermitidas(String extensoesPermitidas) {
		this.extensoesPermitidas = extensoesPermitidas;
	}

	public String getExtensoesPermitidas() {
		return extensoesPermitidas;
	}

	public boolean isPermission(String fileName)
	{
		String lowerCaseName = fileName.toLowerCase();
		StringTokenizer st = new StringTokenizer(extensoesPermitidas," ,.?! \'-:;|");
		while(st.hasMoreTokens()){
			if (lowerCaseName.endsWith("."+st.nextToken()))
				return true;     	
		}

		return false;
	}
}
jeroqueiroz

Você precisa dos arquivos dentro da pasta lib:

commons-fileupload-1.1.1.jar
commons-io-1.2.jar

Página JSP

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Fazendo Upload de arquivos</title>
</head>
<body>
	<jsp:useBean id="upl" scope="page" class="meupacote.UploadBean" />
	<jsp:setProperty name="upl" property="diretorio" value="arquivos"/>
	<jsp:setProperty name="upl" property="size" value="1"/> 
	<jsp:setProperty name="upl" property="extensoesPermitidas" value="jpg, gif, pdf, doc, odt, zip"/>
<%
	if(upl.doFilePost(request,application)){
		out.println(upl.getFilename());
	}
	else{
		if(upl.getErro()!=null)
			out.println(upl.getErro());
	}
%>

	<form method="post" action="fazendoUploadComJsp.jsp" enctype="multipart/form-data">
	     Arquivo: &lt;input type="file" name="file" /&gt;<br />
	     &lt;input type="submit" name="submit" value="Enviar" /&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
J

Isso é bem parecido com um dos exemplos que eu tentei…

Qdo tento usar o que você me passou, bem como todos os que tentei com essa biblioteca, aparece o seguinte erro:

java.lang.Error: Unresolved compilation problems:
The import org.apache.commons.io cannot be resolved
FileCleaningTracker cannot be resolved to a type
FileCleaningTracker cannot be resolved to a type
The method getFileCleaningTracker() from the type DiskFileItemFactory refers to the missing type FileCleaningTracker
FileCleaningTracker cannot be resolved to a type
FileCleaningTracker cannot be resolved to a type
FileCleaningTracker cannot be resolved to a type
FileCleaningTracker cannot be resolved to a type

Já configurei o .jar dentro do Build Path… não sei o que é…

J

não tinha colocado commons-io-1.2.jar, só a outra… :shock:

Vou baixar e adicionar aqui pra ver o que acontece.

J

tentei fazer isso e deu erro:

EVERE: Servlet.service() for servlet jsp threw exception

java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at java.lang.Class.getDeclaredConstructors0(Native Method)

at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)

at java.lang.Class.getConstructor0(Unknown Source)

at java.lang.Class.getConstructor(Unknown Source)

at org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1261)

at org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1178)

at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361)

at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2411)

at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2417)

at org.apache.jasper.compiler.Node$Root.accept(Node.java:495)

at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361)

at org.apache.jasper.compiler.Generator.generate(Generator.java:3426)

at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:216)

at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)

at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)

at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)

at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)

at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)

at java.lang.Thread.run(Unknown Source)
jeroqueiroz

Posta o Código da sua pagina JSP e da Class ai para verificar.

Ou se voc~e utilizou o modelo que mostrei…você add a class no pacote correto, aparentemente como se não encontrasse a class, ou algo do tipo.

J

utilizei o seu modelo… os .jars estão dentro do meu projeto e já configurei dentro do Eclipse…

já olhei aqui tudo, não sei o que eu posso estar fazendo errado… :frowning:

THG_Carvalho
Tenta isso, aqui deu certo:
// the directory where the uploaded file will be saved. 
  String savePath = "C:\\123data\\"; 

  String filename = ""; 

  ServletInputStream in = request.getInputStream(); 

  byte[] line = new byte[128]; 
  int i = in.readLine(line, 0, 128); 
  int boundaryLength = i - 2; 
  String boundary = new String(line, 0, boundaryLength); //-2 discards the newline 
character 

  while (i != -1) {
    String newLine = new String(line, 0, i); 
    if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
      String s = new String(line, 0, i-2); 
      int pos = s.indexOf("filename=\""); 
      if (pos != -1) {
        String filepath = s.substring(pos+10, s.length()-1); 
        // Windows browsers include the full path on the client 
        // But Linux/Unix and Mac browsers only send the filename 
        // test if this is from a Windows browser 
        pos = filepath.lastIndexOf("\\"); 
        if (pos != -1) 
          filename = filepath.substring(pos + 1); 
        else 
          filename = filepath; 
      } 

      //this is the file content 
      i = in.readLine(line, 0, 128); 
      i = in.readLine(line, 0, 128); 
      // blank line   
      i = in.readLine(line, 0, 128); 

      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
      newLine = new String(line, 0, i); 

      while (i != -1 && !newLine.startsWith(boundary)) {
        // the problem is the last line of the file content 
        // contains the new line character. 
        // So, we need to check if the current line is 
        // the last line. 
        buffer.write(line, 0, i); 
        i = in.readLine(line, 0, 128); 
        newLine = new String(line, 0, i); 
      } 
      try {
        // save the uploaded file 
        RandomAccessFile f = new RandomAccessFile(
          savePath + filename, "rw"); 
        byte[] bytes = buffer.toByteArray(); 
        f.write(bytes, 0, bytes.length - 2); 
        f.close(); 
      } 
      catch (Exception e) {} 
    } 
    i = in.readLine(line, 0, 128); 

  } // end while
Criado 23 de novembro de 2009
Ultima resposta 23 de nov. de 2009
Respostas 8
Participantes 3