繁体   English   中英

Spring Boot JPA(Hibernate)如何保存图像

[英]How Spring Boot JPA(Hibernate) saves Images

我只想简单地问一问,当Spring Boot Web应用程序的JPA在数据库中保存数据或BLOB(使用@LOB)或字节数组数据时,将图像保存在数据库中的真正形式是什么。 是将整个字节数据保存在数据库中,还是只保存该字节数组对象的引用或地址,实际上将其保存到系统的文件空间中。

我想特别问一下Spring Boot JPA存储库。 请解释一下。 如果有演示示例进行测试,请提供

转到此存储库,然后转到display-image-from-db分支。 基本方法如下:

  • 在实体中,您具有:

     @Lob private Byte[] image; 
  • ImageController.java通过MultipartFile获取图像

     @PostMapping("recipe/{id}/image") public String handleImagePost(@PathVariable String id, @RequestParam("imagefile") MultipartFile file){ imageService.saveImageFile(Long.valueOf(id), file); return "redirect:/recipe/" + id + "/show"; } 
  • 调用imageService以保存通过file的图像作为参数。

  • 该服务基本上将图像内容复制到字节数组,最后将这个字节数组分配给您的实体。

     @Override @Transactional public void saveImageFile(Long recipeId, MultipartFile file) { try { Recipe recipe = recipeRepository.findById(recipeId).get(); Byte[] byteObjects = new Byte[file.getBytes().length]; int i = 0; for (byte b : file.getBytes()){ byteObjects[i++] = b; } recipe.setImage(byteObjects); recipeRepository.save(recipe); } catch (IOException e) { //todo handle better log.error("Error occurred", e); e.printStackTrace(); } } 

有关完整的源代码,请访问存储库,这肯定会有所帮助。 但是,我强烈建议将文件存储在磁盘上,而不是在数据库中。 DB应该只存储文件的路径。 对于这种解决方案,这里是一个示例: 链接

它将所有字节保存在数据库中,而不会将其导出到文件系统并保存目录。 您必须在代码中专门执行该部分。

为了直接回答该问题,将内容存储在数据库中。 这可能会或可能不会为您服务。 正如@dgarceran提到的,有很多优点和缺点。 无论哪种方式,我都建议您看一下Spring Content

该项目提供了内容/ BLOB的抽象。 对于非结构化数据,什么是Spring Data对结构化数据。 它具有支持JPA(BLOB),文件系统,Mongo的GridFS和S3的模块。 无论选择哪种模块,它都将使您不必编写任何类似@ Ph03n1x所提供的样板代码。

使用Spring Content,您所需要做的就是创建一个ContentStore接口,Spring Content将为您提供实现和控制器。 该实现非常有效,因为它将在客户端和数据库之间流式传输内容(而不是像Ph03n1x的示例那样将整个文件加载到内存中)。 如果需要,抽象还可以使以后轻松更改存储模型变得容易。

有一个快速入门指南在这里和视频教程在这里

HTH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM