【问题标题】:How Spring Boot JPA(Hibernate) saves ImagesSpring Boot JPA(Hibernate) 如何保存图像
【发布时间】:2018-10-26 01:56:07
【问题描述】:

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

我想专门询问 Spring Boot JPA Repository。 请解释一下。 如果有任何演示示例来测试它,请提供它

【问题讨论】:

  • 在数据库中另存为 BLOB 可能需要更多时间来保存和检索。最好将图像保存在文件系统中,只需将路径保存在数据库中即可。
  • 这取决于您需要什么或您拥有什么样的系统。 file system vs database storage 有很多优点和缺点。

标签: java spring hibernate spring-boot jpa


【解决方案1】:

转到此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();
    }
    }
    

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

【讨论】:

  • 大对象不能在自动提交模式下使用。
【解决方案2】:

为了直接回答问题,内容存储在数据库中。这可能适合您,也可能不适合您。正如@dgarceran 提到的那样,有很多优点和缺点。无论哪种方式,我都建议您查看Spring Content

该项目为内容/BLOB 提供了抽象。它之于非结构化数据,就像 Spring Data 之于结构化数据。它具有支持 JPA (BLOB)、文件系统、Mongo 的 GridFS 和 S3 的模块。无论您选择哪种模块,它都可以让您不必编写任何样板代码,就像@Ph03n1x 提供的那样。

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

有一个入门指南here和一个视频教程here

HTH

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-05
      • 2017-10-25
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 2016-03-08
      • 1970-01-01
      • 2021-03-24
      相关资源
      最近更新 更多