DownloadAPP

Introducción

Hace poco en el trabajo se necesita realizar un Servlet en java que permita la descarga de archivos desde una ubicación en el servidor. La aplicación permite:

  • Descargar archivos desde un directorio específico.
  • A través del parámetro archivo de la URL mapeada al Servlet se obtiene el nombre del archivo a descargar.
  • Ideal para la descarga de archivos grandes.

El ejemplo completo se puede descargar desde la sección de descargas

Descripción del código

La descarga se realiza usando las clases BufferedReader y BufferedWriter:

BufferedReader: Lee el archivo desde el sistema y se lee por demanda a través del uso de la función read().

BufferedWriter: Escribe el contenido del archivo en la salida del servlet (response.getOutputStream()).

El tipo de documento se obtiene haciendo uso de la clase MimetypesFileTypeMap con la función getContentType( file.getName());

Uso del ejemplo

 La constante directorio_base almacena la ruta del directorio, para éste caso, el directorio es /srv/files/ :

elt

En caso de usar el aplicativo de ejemplo, cambiar la la ruta directorio_base y usar la URL: localhost:8080/downloadapp/FileDownload?archivo=<nombrearchivo>

Código

/**
 * Autor: Jean Mazuelos
 * Web: http://jeanmazuelos.com/blog
 * Descripción: Permite la descarga de archivos desde una directorio
 * del servidor. Para probar la descarga usar la URL:
 * 	http://localhost:8080/<nombre APP>/FileDownload?archivo=<nombrearchivo>
 * <nombre APP> : Nombre del aplicativo WEB
 * <nombrearchivo>: El nombre de archivo a descargar
 */
package controller;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

import javax.activation.MimetypesFileTypeMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class FIleDownload
 */
@WebServlet("/FileDownload")
public class FileDownload extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final String directorio_base ="/srv/files/";
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FileDownload() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String archivo = request.getParameter("archivo");
		
		if(archivo==null || archivo.isEmpty()){
			response.getWriter().write("No se ha especificado el archivo a descargar.");
			return;
		}
		
		File file = new File(directorio_base + archivo);
		
		if(file.exists()){
			BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(response.getOutputStream() ) );
			BufferedReader br = new BufferedReader(new FileReader(file));
			String mimeType = new MimetypesFileTypeMap().getContentType( file.getName() );

			response.setContentType( mimeType );
			response.setHeader( "Content-Disposition", "attachment;filename=" + file.getName() );
  
			int c;
			while ((c = br.read()) != -1) {
				bw.write(c);
			}

			br.close();
			bw.flush();
			bw.close();
		}
		else{
			response.sendError(HttpServletResponse.SC_NOT_FOUND);
		}
	}

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

}