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