Upload e download de arquivo JSP

Neste exemplo, aprenderemos como fazer upload e download de um arquivo atravรฉs de JSP.

A saรญda de entrada de arquivo sรฃo operaรงรตes muito importantes. Aqui vamos ler e escrever um arquivo usando JSP.

Upload de arquivo JSP

  • Podemos fazer upload de qualquer arquivo usando JSP.
  • Pode ser um arquivo de texto, arquivo binรกrio, arquivo de imagem ou qualquer outro documento.
  • Aqui, no caso de upload de arquivo, apenas o mรฉtodo POST serรก utilizado e nรฃo o mรฉtodo GET.
  • O atributo Enctype deve ser definido como multipart/form-data.

Exemplo: Usando Aรงรฃo

Neste exemplo, estamos enviando um arquivo usando o objeto IO

Action_file.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru File</title>
</head>
<body>
<a>Guru File Upload:</a>
Select file: <br />
<form action="action_file_upload.jsp" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>

Action_file_upload.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<!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=ISO-8859-1">
<title>Guru File Upload</title>
</head>
<body>
<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   String filePath = "E:/guru99/data";

   String contentType = request.getContentType();
   if ((contentType.indexOf("multipart/form-data") >= 0)) {

      DiskFileItemFactory factory = new DiskFileItemFactory();
      factory.setSizeThreshold(maxMemSize);
      factory.setRepository(new File("c:\\temp"));
      ServletFileUpload upload = new ServletFileUpload(factory);
      upload.setSizeMax( maxFileSize );
      try{ 
         List fileItems = upload.parseRequest(request);
         Iterator i = fileItems.iterator();
         out.println("<html>");
         out.println("<body>");
         while ( i.hasNext () ) 
         {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () )  {
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                file = new File( filePath + "yourFileName") ;
                fi.write( file ) ;
                out.println("Uploaded Filename: " + filePath + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
      }catch(Exception ex) {
         System.out.println(ex);
      }
   }else{
      out.println("<html>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>"); 
      out.println("</body>");
      out.println("</html>");
   }
%>
</body>
</html>

Explicaรงรฃo do cรณdigo:

Action_file.jsp

Linha de cรณdigo 12-18: Aqui estamos criando um formulรกrio com campo de arquivo, que farรก o upload do arquivo para o servidor e a aรงรฃo serรก passada para action_file_upload.jsp

Action_file_upload.jsp

Linha de cรณdigo 20: Aqui estamos fornecendo o caminho do arquivo para um caminho especรญfico

Linha de cรณdigo 23-38: Aqui verificamos se o tipo de conteรบdo รฉ multipart/form-data. Se for esse o caso, o conteรบdo รฉ do tipo arquivo e รฉ lido. Apรณs a leitura do arquivo, ele รฉ gravado no arquivo temporรกrio e entรฃo o arquivo temporรกrio รฉ convertido no arquivo principal.

Ao executar o cรณdigo acima, vocรช obtรฉm a seguinte saรญda

Upload de arquivo JSP

Saรญda:

Estamos carregando o arquivo usando a opรงรฃo escolher o botรฃo de arquivo e o botรฃo carregar o arquivo farรก o upload do arquivo para o servidor no caminho fornecido.

Exemplo: Usando operaรงรตes JSP

Neste exemplo, faremos upload de um arquivo usando operaรงรตes JSP. Pegaremos um formulรกrio que terรก um botรฃo โ€œuploadโ€ e quando vocรช clicar no botรฃo upload, o arquivo serรก carregado.

Carregando_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Uploading File</title>
</head>
<body>
File: <br />
<form action="guru_upload" method="post"
                        enctype="multipart/form-data">
<input type="file" name="guru_file" size="50" />
<br />
<input type="submit" value="Upload" />
</form>
</body>
</html>

Explicaรงรฃo do cรณdigo:

Linha de cรณdigo 11-12: Aqui estamos pegando um formulรกrio que tem aรงรฃo no servlet guru_upload que passarรก por um mรฉtodo POST. Alรฉm disso, aqui nรณs enctype o atributo ie que especifica como os dados do formulรกrio devem ser codificados e enviados ao servidor e ele รฉ usado apenas com o mรฉtodo POST. Aqui estamos definindo como multipart/form-data que รฉ para o arquivo (pois os dados serรฃo grandes).

Linha de cรณdigo 13: Aqui estamos especificando o elemento guru_file com o tipo file e fornecendo o tamanho 50.

Linha de cรณdigo 15: Este รฉ um botรฃo de tipo de envio com o nome โ€œUploadโ€ atravรฉs do qual o servlet de aรงรฃo serรก chamado e a solicitaรงรฃo serรก processada nele e o arquivo serรก lido e gravado no servlet.

Guru_upload.java

package demotest;

import java.io.File;
import java.io.IOException;
import java.util.List;

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

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

public class guru_upload extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
    public guru_upload() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        if(ServletFileUpload.isMultipartContent(request)){
		            try {
		                List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
		                for(FileItem item : multiparts){
		                    if(!item.isFormField()){
		                        String name = new File(item.getName()).getName();
		                        item.write( new File("c:/guru/upload" + File.separator + name));
		                    }
		                }
		               //File uploaded successfully
		               request.setAttribute("gurumessage", "File Uploaded Successfully");
		            } catch (Exception ex) {
		               request.setAttribute("gurumessage", "File Upload Failed due to " + ex);
		            }         		
		        }else{
		
		            request.setAttribute("gurumessage","No File found");
 }
		        request.getRequestDispatcher("/result.jsp").forward(request, response);
		
		    }


}

Explicaรงรฃo do cรณdigo:

Linha de cรณdigo 12-14: Aqui teremos que importar a biblioteca org.apache.commons para a configuraรงรฃo do cรณdigo. Teremos que importar a classe fileupload da biblioteca org.apache.commons.

Linha de cรณdigo 23: Aqui temos o mรฉtodo doPost(), que serรก chamado conforme estivermos passando o mรฉtodo POST em JSP e ele solicitarรก e responderรก objetos como seus parรขmetros

Linha de cรณdigo 26: Aqui estamos criando um objeto da classe ServletFileUpload do pacote fileUpload da biblioteca org.apache.commons que irรก verificar se existe algum objeto de arquivo em JSP. Se algum for encontrado, esses objetos de arquivo serรฃo retirados da solicitaรงรฃo.

Linha de cรณdigo 27-32: Iremos iterar o nรบmero de arquivos verificando quantos itens de arquivo estรฃo presentes no objeto multiparts que รฉ um objeto de lista (se fizermos upload de mais de um arquivo) e salvรก-lo na pasta c:/guru/upload com o nome do arquivo que foi fornecido . Estamos gravando o arquivo usando o mรฉtodo write do objeto de arquivo na pasta que foi mencionada.

Linha de cรณdigo 34: Se nรฃo houver exceรงรฃo, estamos definindo o atributo na solicitaรงรฃo como gurumessage com valor โ€œArquivo enviado com sucessoโ€.

Linha de cรณdigo 35-36: Se ocorrer uma exceรงรฃo, serรก definida a mensagem โ€œFalha no upload do arquivoโ€

Linha de cรณdigo 40: Se o arquivo nรฃo for encontrado, defina a mensagem como โ€œNenhum arquivo encontradoโ€

Linha de cรณdigo 42: Encaminhando solicitaรงรฃo usando o objeto requestdispatcher para result.jsp com objetos de solicitaรงรฃo e resposta.

Resultado.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Result</title>
</head>
<body>
<% String msg = (String)request.getAttribute("message");
   out.println(msg);
%>
</body>
</html>

Explicaรงรฃo do cรณdigo:

Linha de cรณdigo 10: Aqui estamos obtendo o atributo do objeto de solicitaรงรฃo com valor gurumessage em um objeto string.

Linha de cรณdigo11: Aqui estamos imprimindo essa mensagem.

Quando executamos o cรณdigo acima, obtemos a seguinte saรญda

Saรญda:

Obtemos um formulรกrio onde existem campos para escolher um arquivo do diretรณrio. Assim que o arquivo for selecionado, temos que clicar no botรฃo de upload.

Upload de arquivo usando operaรงรตes JSP

Assim que o botรฃo de upload for clicado, receberemos a mensagem de que o arquivo foi carregado com sucesso.

Upload de arquivo usando operaรงรตes JSP

No diagrama abaixo podemos ver que o arquivo foi carregado na pasta c:/guru/upload.

Upload de arquivo usando operaรงรตes JSP

Download do arquivo JSP

Neste exemplo, vamos baixar um arquivo de um diretรณrio clicando no botรฃo.

Baixando_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Downloading Guru Example</title>
</head>
<body>
Guru Downloading File<a href="guru_download">Download here!!!</a>
</body>
</html>

Explicaรงรฃo do cรณdigo:

Linha de cรณdigo 10: Aqui fornecemos um link para baixar um arquivo da pasta c:/guru/upload usando o servlet guru_download .

Guru_download.java

package demotest;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class guru_download
 */
public class guru_download extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String gurufile = "test.txt";
		String gurupath = "c:/guru/upload/";
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ gurufile + "\"");
 
		FileInputStream fileInputStream = new FileInputStream(gurupath
				+ gurufile);
 
		int i;
		while ((i = fileInputStream.read()) != -1) {
			out.write(i);
		}
		fileInputStream.close();
		out.close();
	}


	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Explicaรงรฃo do cรณdigo:

Linha de cรณdigo 3-5: Aqui estamos importando FileInputStream , IO Exception e PrintWriter do pacote java.io.

Linha de cรณdigo 15: Estamos definindo guru_download servlet que estende HttpServlet.

Linha de cรณdigo 18: Como definimos um href, que serรก incluรญdo na URL, o mรฉtodo GET serรก processado (doGet serรก chamado no servlet), que tambรฉm inclui objetos de solicitaรงรฃo e resposta.

Linha de cรณdigo 19-20: Estamos definindo o tipo de conteรบdo no objeto de resposta e tambรฉm obtendo o objeto escritor da resposta.

Linha de cรณdigo 21-22: Definindo uma variรกvel como gurufile como valor test.txt e gurupath como c:/guru/upload/

Linha de cรณdigo 23-25: Estamos definindo o tipo de conteรบdo usando o objeto de resposta e usamos o mรฉtodo setHeader que define o cabeรงalho no objeto de resposta como o nome do arquivo que foi carregado.

Linha de cรณdigo 27-28: Estamos criando FileInputStream no qual adicionaremos gurupath+gurufile.

Linha de cรณdigo 31-33: Aqui tomamos uma loop while que serรก executado atรฉ que o arquivo seja lido, portanto, demos a condiรงรฃo! = -1. Nesta condiรงรฃo, estamos escrevendo usando o objeto printwriter out.

Ao executar o cรณdigo acima, vocรช obterรก a seguinte saรญda

Saรญda:

Baixando arquivo

Saรญda:

Temos que clicar em download_1.jsp e obteremos um hiperlink como โ€œBaixar aquiโ€. Ao clicar neste arquivo de hiperlink, ele serรก baixado no sistema.

Resumo

  • Aprendemos sobre o formulรกrio de registro para se registrar em qualquer aplicativo
  • Aprendi mais sobre como funcionam os formulรกrios de login e logout.
  • Tambรฉm aprendi sobre upload e download de um arquivo via JSP.

Resuma esta postagem com: