2011-02-28 2 views
6

J'ai un système construit avec Spring Framework 3 et maintenant je dois implémenter un téléchargement de fichier. Pour exécuter l'action "donwload", j'obtiens généralement l'objet HttpServletReponse, définissez les en-têtes et récupérez l'outputtream de l'utilisateur.Quelle est la meilleure façon de faire un contrôleur de téléchargement sur Spring MVC?

Cela fonctionne bien, mais j'aimerais savoir s'il existe une façon plus simple et plus intelligente de le faire?

Merci beaucoup!

+0

semble assez bon pour moi, la seule autre option serait une redirection dans un iframe caché dans le fichier que vous voulez qu'ils télécharger, mais j'aime ce que vous a fait un peu mieux. – Zoidberg

Répondre

8

Vous pouvez utiliser @ResponseBody et retourner un 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

J'ai trouvé qu'utiliser l'annotation @RepsonseBody force le type de contenu à être celui de ServletRequest .. donc response.setContentType(); ne fonctionne pas .. – gipinani

0

Avec ressort mvc vous pouvez passer OutputStream et HttpEntity comme paramètres, mais en passant le HttpServletResponse à une méthode de contrôleur est une approche parfaitement bien.

0

Il y a d'autres façons, mais elles sont du point de vue de l'architecte/concepteur ou du génie logiciel, ce qui peut ou non être plus facile/plus intelligent. Si vous demandez à un concepteur, il pourrait dire que le contrôleur ne devrait pas être au courant du téléchargement de données (modèle). Certains pourraient même recommander de ne pas utiliser HttpServletReponse dans le contrôleur et certains recommandent d'étendre AbstractView (ou de choisir une sous-classe appropriée) afin qu'il puisse être réutilisé ou vider le flux dans le corps de la réponse pour séparer la vue du contrôleur. Il peut y avoir d'autres façons, mais ma recommandation est de garder les choses simples et d'implémenter tout ce qui fonctionne dans l'équipe, mais je recommanderais de vérifier avec le concepteur/architecte (si vous avez) pour éviter toute retouche parce qu'ils peuvent avoir une perspective différente.

Questions connexes