web-dev-qa-db-fra.com

Chargement et diffusion d'images Spring Boot

Je crée une nouvelle application Spring Boot et je veux pouvoir stocker et diffuser des images. Je veux que les images soient stockées dans le répertoire des applications here

voici à quoi ressemble le téléchargement:

@PostMapping("/")
@ResponseBody
public String upload(@RequestPart String title, @RequestPart MultipartFile img) throws IOException{
    String imgName = img.getOriginalFilename();
    Post p = new Post();
    p.setTitle(title);
    p.setImageName(imgName);
    postService.add(p);
    File upl = new File("images/" + imgName);
    upl.createNewFile();
    FileOutputStream fout = new FileOutputStream(upl);
    fout.write(img.getBytes());
    fout.close();
    return "ok";
}

voici comment je veux obtenir des images

<img th:src="@{'images/' + ${post.imageName}}"/>

pour l'instant je reçois 404 et quand je veux voir des images dans le répertoire je reçois 

Fatal error reading PNG image file: Not a PNG file

comment devrais-je le faire pour que cela fonctionne?

4
Weras Adve

Par défaut, votre application Spring Boot sert statique contenu - dans votre cas, des images sont disponibles aux emplacements suivants:

  • /statique
  • /Publique
  • /Ressources
  • / META-INF/resources

Donc, normalement, static/images/ serait peut-être l'endroit où Thymeleaf devrait s'attendre aux images statiques qui doivent être livrées pour le rendu. Mais puisque cet endroit concerne le contenu statique et qu'il est en général une mauvaise idée de sauvegarder le contenu importé (dynamique) dans votre application, je recommanderais de NE PAS le faire. Avez-vous pensé à ce qui se passe si votre application est redéployée ou déplacée vers une autre machine? Vous devez sauvegarder/déplacer les images de manière fastidieuse. Il existe de meilleures solutions, en stockant le contenu de téléchargement dans un emplacement séparé en dehors de votre application (pouvant par exemple être configurable et réutilisé par plusieurs instances) ou même en utilisant une base de données pour stocker des données d'image. Cela permettrait également de gérer les images dans un contexte transactionnel (par exemple, isolement et restauration).

Mais si vous souhaitez maintenant le stocker dans votre application, vous pouvez étendre les emplacements en ajoutant des emplacements à rechercher (en fait, _ {statique contenu). Bien que la réponse de Ajit et même la documentation donnent toujours le conseil d’étendre votre propre variable WebMvcConfigurerAdapter, j’aurais plutôt tendance à implémenter WebMvcConfigurer à la place, car ce dernier est obsolète.

Dans ce cas, cela devrait ressembler à:

@Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
    }
}
12
Kevin Peters

Pour accéder à l'image à partir de votre images folder

 enter image description here

Vous devez redéfinir la méthode addResourceHandlers de la classe WebMvcConfigurerAdapter comme ceci:

@Configuration
public class ResourceConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
    }
}

Après cela, vous devez ajouter / avant les images dans l'URL, comme ceci:

<img th:src="@{'/images/' + ${post.imageName}}"/>
3
Ajit Soman

Vous pouvez stocker des fichiers externes dans un dossier nommé /static dans le même répertoire que votre fichier jar. Spring les analysera par défaut. Donc, si vous avez static/images/, vous pouvez référencer vos images avec:

<img th:src="@{/images/img.ext}"/>

Donc, vous voudriez utiliser new File("/static/images/" + imgName);

1
Scott