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/ :
eltEn 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 } }