Upload de arquivos com Servlet

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?

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;
	}
}

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;

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 é…

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

Vou baixar e adicionar aqui pra ver o que acontece.

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)

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.

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:

Tenta isso, aqui deu certo:

[code]
// 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[/code]