[英]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.