5 votes

Quelle est la meilleure façon de diffuser des médias avec Spring MVC ?

J'ai une méthode de contrôleur qui transmet simplement des octets pour les médias (images, css, js, etc.) au client. J'ai d'abord essayé quelque chose comme ceci :

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
@ResponseBody
public byte[] getMedia(HttpServletRequest request) throws IOException
{
    //logic for getting path to media on server

    return Files.readAllBytes(Paths.get(serverPathToMedia));
}

J'ai d'abord testé cela dans Firefox, et tout semblait fonctionner correctement. Cependant, j'ai ensuite essayé dans Chrome, et j'ai constaté qu'aucune des images ne fonctionnait. J'ai donc modifié le texte en quelque chose comme ceci :

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
public ResponseEntity<byte[]> getMedia(HttpServletRequest request) throws IOException
{
    //logic for getting path to media on server

    byte[] bytes = Files.readAllBytes(Paths.get(serverPathToMedia));
    //logic for setting some header values like Content-Type and Content-Length
    return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
}

Cela a donné les mêmes résultats que précédemment. J'ai vu dans les outils du développeur que mes en-têtes de réponse descendaient comme prévu, mais toujours pas d'octets d'image.

Ensuite, j'ai essayé quelque chose comme ça :

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
public void getMedia(HttpServletRequest request, HttpServletResponse response) throws IOException
{
    //logic for getting path to media on server

    byte[] bytes = Files.readAllBytes(Paths.get(serverPathToMedia));
    response.getOutputStream().write(bytes);
}

Sans même définir d'en-tête de réponse, cela fonctionne dans Firefox et Chrome. Maintenant, bien que je puisse le faire de cette dernière façon puisque cela fonctionne, cela ne semble pas être la bonne façon de faire de Spring MVC. Je veux savoir pourquoi les deux premières méthodes que j'ai essayées n'ont pas fonctionné, car elles semblent plus correctes. De plus, y a-t-il quelque chose que je n'ai pas essayé et qui serait en fait la bonne façon de faire ?

5voto

Biju Kunjummen Points 20258

Votre dernière approche est à peu près la façon de procéder. Le seul changement que je peux suggérer est de ne pas garder en mémoire l'intégralité du fichier de contenu à diffuser, mais de diffuser le contenu avec une mise en mémoire tampon. IOUtils d'Apache Commons peut le faire pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X