it-swarm.com.de

Spring Boot Images hochladen und servieren

Ich mache eine neue Spring Boot-App und möchte Bilder speichern und liefern können. Ich möchte, dass Bilder im Anwendungsverzeichnis gespeichert werden hier

so sieht das Hochladen jetzt aus:

@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";
}

so möchte ich Bilder bekommen

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

für jetzt bekomme ich 404 und wenn ich einige bilder im verzeichnis sehen möchte, bekomme ich 

Fatal error reading PNG image file: Not a PNG file

wie soll ich es machen, damit es funktioniert?

4
Weras Adve

Standardmäßig liefert Ihre Spring Boot-Anwendung statisch Inhalt - in Ihren Fallbildern - an folgenden Stellen:

  • /statisch
  • /Öffentlichkeit
  • /Ressourcen
  • / META-INF/Ressourcen

Normalerweise wäre static/images/ wahrscheinlich der Ort, an dem Thymeleaf die statischen Bilder erwarten sollte, die zum Rendern geliefert werden müssen. Da es sich hier jedoch um statische -Inhalte handelt und es generell eine schlechte Idee ist, hochgeladenen (dynamischen) Inhalt in Ihrer Anwendung zu speichern, würde ich empfehlen, DON'T das zu tun. Haben Sie darüber nachgedacht, was passiert, wenn Ihre Anwendung neu bereitgestellt oder auf einen anderen Computer verschoben wird? Sie müssten die Bilder auf umständliche Weise sichern/verschieben. Es gibt bessere Lösungen, wenn Sie den Upload-Inhalt an einem separaten Ort außerhalb Ihrer App speichern (der beispielsweise konfigurierbar und auch von mehreren Instanzen wieder verwendet werden kann) oder sogar eine Datenbank zum Speichern von Bilddaten verwenden. Dies würde auch die Handhabung von Bildern in einem Transaktionskontext ermöglichen (z. B. Isolation & Rollbacks).

Wenn Sie es jedoch weiterhin in Ihrer App speichern möchten, können Sie die Speicherorte erweitern, indem Sie Orte hinzufügen, nach denen gesucht werden soll (tatsächlich statisch Inhalt. Obwohl die Antwort von Ajit und sogar die Dokumentation immer noch den Rat zur Erweiterung Ihrer eigenen WebMvcConfigurerAdapter enthält, neige ich eher dazu, WebMvcConfigurer zu implementieren, da die erstere nicht mehr verwendet wird.

In diesem Fall sollte es so aussehen:

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

Um von Ihrem images folder aus auf ein Bild zuzugreifen, 

 enter image description here

Sie müssen die addResourceHandlers-Methode der WebMvcConfigurerAdapter-Klasse wie folgt überschreiben:

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

Danach müssen Sie / vor Bildern in URL wie folgt hinzufügen:

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

Sie können externe Dateien in einem Ordner mit dem Namen /static in demselben Verzeichnis wie Ihr Glas speichern, und Spring scannt sie standardmäßig. Wenn Sie static/images/ haben, können Sie Ihre Bilder referenzieren mit:

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

Sie möchten also new File("/static/images/" + imgName); verwenden

1
Scott