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

7
我想简单地问一下,当Spring Boot Web应用程序的JPA在数据库中保存数据或BLOB(使用@LOB)或字节数组数据时,图像在数据库中的真实形式是什么。它会将整个字节数据保存到数据库中,还是只保存该字节数组对象的引用或地址,并实际将其保存到系统文件空间中。
我想特别询问Spring Boot JPA Repository。请解释一下。如果有任何演示示例,请提供。

1
将BLOB保存在数据库中可能需要更多时间来保存和检索。最好将图像保存在文件系统中,只需在数据库中保存路径即可。 - Harshit
这取决于你的需求或你所拥有的系统类型。对于文件系统与数据库存储,存在许多利弊之处。请参考file system vs database storage了解更多信息。 - dgarceran
3个回答

13

前往此存储库,进入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();
    }
    }
    

    想要查看完整的源代码,请前往项目库,这肯定会有所帮助。 不过我强烈建议将文件存储在磁盘上而不是数据库中。数据库只应该存储文件路径。对于这种解决方案,以下是一个示例:链接


    大对象不能在自动提交模式下使用。 - withoutOne

    4
    直接回答问题,内容存储在数据库中。这可能适用于您,也可能不适用。正如@dgarceran所提到的,有很多优缺点。无论如何,我建议您看一下Spring Content
    该项目为内容/BLOB提供了一个抽象。它对于非结构化数据就像Spring Data对于结构化数据一样。它具有支持JPA(BLOB)、文件系统、Mongo的GridFS和S3的模块。无论您选择哪个模块,它都会使您免于编写任何引导代码,例如@Ph03n1x提供的那些代码。
    使用Spring Content,您只需创建一个ContentStore接口,Spring Content将为您提供实现和控制器。实现是高效的,因为它会在客户端和数据库之间流传内容(而不像Ph03n1x的示例那样将整个文件加载到内存中)。该抽象还使得以后更改存储模型变得容易,如果需要的话。
    这里有入门指南here,以及视频教程here
    希望对你有所帮助。

    1
    它将保存数据库中的所有字节,不会将其导出到文件系统并保存目录。您需要在代码中专门完成此部分。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接