2017-08-12 49 views
2

我在做新的Spring引導應用程序,並希望能夠存儲並提供圖片,我想的圖像將被存儲在應用程序目錄顯示 here春季啓動圖像上傳和服務

這是上傳的樣子現在:

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

這就是我想要得到的圖像

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

現在我得到404,當我想查看一些目錄中的圖像我得到

Fatal error reading PNG image file: Not a PNG file 

我應該怎麼做才能使它工作?

回答

4

默認情況下,您的Spring Boot應用程序服務於static content - 在您的病例圖片中 - 在以下位置找到:

  • /靜態
  • /公共
  • /資源
  • /META-INF /資源

所以通常情況下,static/images/或許應該在那裏Thymeleaf應該期望靜態圖像的地方,其必須交付渲染。但由於這個地方大約是靜態內容,並且由於在應用程序中保存上傳的(動態)內容通常是一個壞主意,所以我會建議不要那樣做。你是否想過如果你的應用程序被重新部署或移動到另一臺機器會發生什麼?您將不得不以繁瑣的方式備份/移動圖像。有更好的解決方案,將上傳內容存儲在應用程序外部的單獨位置(例如可以配置並且可以由多個實例重用),甚至可以使用數據庫存儲圖像數據。這也可以在事務上下文中處理圖像(例如,隔離&回滾)。

但是,如果您現在仍想將其存儲在您的應用中,則可以通過添加要搜索的地點來擴展位置(實際上是靜態內容)。儘管Ajit的答案甚至文檔仍然給出了建議來擴展自己的WebMvcConfigurerAdapter,但我個人傾向於實現WebMvcConfigurer,因爲前者已被棄用。

在這種情況下,它應該是這樣的:

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

謝謝:d –

+0

歡迎您:) –

1

要從images folder訪問圖像,你需要重寫的WebMvcConfigurerAdapter類這樣addResourceHandlers方法:

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

之後,你需要圖像之前在URL中添加/這樣的:

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

感謝您的解決了這個問題的答案 –