当前位置: 首页 > 知识库问答 >
问题:

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

耿志义
2023-03-14

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

我想专门询问Spring启动JPA存储库。请解释一下。如果有任何演示示例进行测试,请提供

共有3个答案

诸葛绍元
2023-03-14

它将保存数据库中的所有字节,但不会将其导出到文件系统并保存目录。你必须在代码中明确地做这一部分。

经炜
2023-03-14

为了直接回答这个问题,内容被存储在数据库中。这对你可能有用,也可能没用。正如@dgarceran提到的,有一堆利弊。无论哪种方式,我都建议你看一看Spring的内容。

这个项目提供了内容/BLOB的抽象。它是非结构化数据,就像Spring Data是结构化数据一样。它有支持JPA(BLOB)、文件系统、Mongo的GridFS和S3的模块。无论您选择哪个模块,它都将使您不必编写像@Ph03n1x提供的任何样板代码。

使用Spring Content,您只需创建一个< code>ContentStore接口,Spring Content将为您提供实现和控制器。该实现是高效的,因为它将在客户机和数据库之间传输内容(而不是像Ph03n1x的例子那样将整个文件加载到内存中)。这种抽象还使得以后在需要时更改存储模型变得容易。

这里有入门指南,这里有视频教程

HTH

史朗
2023-03-14

转到该存储库并转到< code > display-image-from-db 分支。基本方法如下:

>

  • 在实体中,您拥有:

    @Lob
    private Byte[] image;
    

    图像控制器。java-通过多部分文件获取图像

    @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";
    }
    

    调用< code>imageService以保存图像,并将< code>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();
    }
    }
    

    对于完整的源代码去回购,这肯定会有所帮助。然而,我强烈建议将文件存储在磁盘上,而不是数据库中。数据库应该只存储文件的路径。对于这样的解决方案,这里有一个例子:链接

  •  类似资料:
    • 问题内容: 在我的应用程序中,我在div中有一个图像,一个按钮。 我想旋转显示的图像,并在使用jquery单击按钮时保存旋转的图像。 我已经使用了代码: http://code.google.com/p/jquery-rotate/ 和jQuery代码: html代码: 当我使用上述代码时,有两个图像,一个是旧图像,另一个是旋转图像。 在这里我想旋转相同的图像并仅显示旋转的图像。并将旋转的图像保存

    • 问题内容: 我刚刚使用Python图像库(PIL)进行了一些图像处理,这是我之前发现的用于执行图像的傅立叶变换的文章,但是我无法使用save函数。整个代码运行良好,但不会保存生成的图像: 我得到的错误如下: 如何使用Pythons PIL保存图像? 问题答案: 已解决有关文件扩展名的错误,您可以使用(不带点)或将输出名称与扩展名一起传递。现在要处理该错误,您需要在频域中适当地修改数据以将其保存为整

    • 问题内容: 我正在从UI发送对象。将使用对现有子项的引用来创建该对象。 这是这种关系的简单说明。 保存该对象时,Hibernate给我“ org.hibernate.TransientPropertyValueException:对象引用了一个未保存的瞬态实例”。 我根本不需要改变孩子,所以不必拯救孩子。只需要将孩子的ID保存在父母的表中。 我尝试使用一些CascadeType,但没有一个起作用。

    • 我试图将字节保存为图像,但似乎不起作用。 以下是我尝试过的: 但我得到一个错误,说它不能写模式RGBA为JPEG,所以我猜这个方法只适用于PNG?如果是这样的话,有没有其他方法来处理jpeg图像?

    • 问题内容: 当我尝试保存顶级实体(使用JPA)时,我是否需要从数据库中重新获取ManyToOne映射实体并进行设置,还是不能仅设置(ManyToOne映射实体的ID并保存顶级实体?)它抛出的实体:org.hibernate.TransientObjectException: 我们正在使用的表结构: (这两个类都具有用于所有字段的setter和getter方法以及默认构造函数,该构造函数以主键作为参

    • 我创建了一个简单的应用程序,裁剪图像。现在我想保存这个图像到消防基地。 如何将此图像保存到Firebase。我尝试了很多教程,但都没有成功。请用简单的代码验证。