我想简单地问一下,当Spring Boot Web应用程序的JPA在数据库中保存数据或BLOB(使用@LOB)或字节数组数据时,图像在数据库中的真实形式是什么。它会将整个字节数据保存到数据库中,还是只保存该字节数组对象的引用或地址,并实际将其保存到系统文件空间中。
我想特别询问Spring Boot JPA Repository。请解释一下。如果有任何演示示例,请提供。
我想特别询问Spring Boot JPA Repository。请解释一下。如果有任何演示示例,请提供。
前往此存储库,进入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();
}
}
想要查看完整的源代码,请前往项目库,这肯定会有所帮助。 不过我强烈建议将文件存储在磁盘上而不是数据库中。数据库只应该存储文件路径。对于这种解决方案,以下是一个示例:链接
ContentStore
接口,Spring Content将为您提供实现和控制器。实现是高效的,因为它会在客户端和数据库之间流传内容(而不像Ph03n1x的示例那样将整个文件加载到内存中)。该抽象还使得以后更改存储模型变得容易,如果需要的话。