2011-02-28 13 views
6

Tengo un sistema creado con Spring Framework 3 y ahora debo implementar una descarga de archivos. Para ejecutar la "acción donwload" usualmente obtengo el objeto HttpServletReponse, establezco los encabezados y obtengo la salida de salida del usuario.¿Cuál es la mejor manera de hacer un controlador de descarga en Spring MVC?

Funciona bien, pero me gustaría saber si hay una forma más fácil/más inteligente de hacerlo?

¡Muchas gracias!

+0

suena bastante bien para mí, la única otra opción sería una redirección en un iframe oculto para el archivo que desea que se descarguen, pero me gusta lo que lo he hecho un poco mejor – Zoidberg

Respuesta

8

Puede utilizar @ResponseBody y devolver una byte[]

@RequestMapping("/getImage") 
@ResponseBody 
public byte[] getImage(HttpServletResponse response) throws IOException { 
    File imageFile = new File("image.jpg"); 
    byte[] bytes = org.springframework.util.FileCopyUtils.copyToByteArray(imageFile); 

    response.setHeader("Content-Disposition", "attachment; filename=\"" + imageFile.getName() + "\""); 
    response.setContentLength(bytes.length); 
    response.setContentType("image/jpeg"); 

    return bytes; 
} 
+0

He encontrado que el uso del tipo de contenido de fuerza de anotación @RepsonseBody es el de ServletRequest ... así que response.setContentType(); no funciona ... – gipinani

0

Con mvc de muelle puede pasar OutputStream y HttpEntity como parámetros, pero pasar el HttpServletResponse a un método de controlador es un enfoque perfectamente fino.

0

Existen otras formas, pero desde el punto de vista de un arquitecto/diseñador o desde el punto de vista de los principios de la ingeniería de software de sonido, que pueden o no ser más fáciles/más inteligentes. Si le pregunta a un diseñador, podría decir que el controlador no debería estar al tanto de la descarga de datos (modelo). Algunos incluso podrían recomendar no usar HttpServletReponse en el controlador y algunos recomendarían extender AbstractView (o elegir una subclase adecuada) para poder reutilizarlo o descargarlo en el cuerpo de respuesta para separar la vista del controlador.

Puede haber otras formas, pero mi recomendación es mantenerlo simple e implementar lo que funcione en el equipo —, aunque recomendaría consultar con el diseñador/arquitecto (si tiene) para evitar cualquier repetición porque pueden tener una perspectiva diferente.

Cuestiones relacionadas