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.