将图像存储在BLOB类型的数据库中

问题描述 投票:0回答:1

我有一个问题。如何将文件保存在数据库中?我将Spring Boot用于后端语言和PostgreSQL数据库。我有一个用户实体,并且有“头像”字段:

@Lob
@Column(name = "avatar", columnDefinition="BLOB")
private byte[] avatar;

@Lob
@Basic(fetch = FetchType.LAZY)
public byte[] getAvatar() {
   return avatar;
}
public void setAvatar(byte[] avatar) {
   this.avatar = avatar;
}

[当我第一次注册用户时,化身为空,并且当我将用户保存到数据库时,我收到一个错误(InvalidDataAccessResourceUsageException)和以下消息:错误:列“ avatar”的类型为jsonb,但表达式的类型为oid提示:您将需要重写或强制转换表达式。位置:173我该怎么做才能解决这个问题?Spring如何解决此问题并将文件保存在DB中?最佳做法是什么?

spring postgresql spring-boot file blob
1个回答
0
投票

您应该看一下社区项目Spring Content。该项目为您提供了类似于Spring Data的API和内容开发方法。 Spring Data是对非结构化数据(文档,图像,视频等)的结构化数据。您可以添加以下内容:-

pom.xml(也提供Spring Boot入门)

   <!-- Java API -->
   <dependency>          
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-jpa</artifactId>
      <version>1.0.0.M10</version>
   </dependency>
   <!-- REST API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-rest</artifactId>
      <version>1.0.0.M10</version>
   </dependency>

配置

@Configuration
// enables Java API 
@EnableJpaStores
// enables REST API 
@Import("org.springframework.content.rest.config.RestConfiguration.class") 
public class ContentConfig {

   // specify the resource specific to your database
   @Value("/org/springframework/content/jpa/schema-drop-postgresql.sql")
   private ClasspathResource dropBlobTables;

   // specify the resource specific to your database
   @Value("/org/springframework/content/jpa/schema-postgresql.sql")
   private ClasspathResource createBlobTables;

   @Bean
   DataSourceInitializer datasourceInitializer() {
     ResourceDatabasePopulator databasePopulator =
            new ResourceDatabasePopulator();

     databasePopulator.addScript(dropBlobTables);
     databasePopulator.addScript(createBlobTables);
     databasePopulator.setIgnoreFailedDrops(true);

     DataSourceInitializer initializer = new DataSourceInitializer();
     initializer.setDataSource(dataSource());
     initializer.setDatabasePopulator(databasePopulator);

     return initializer;
   }
}

注意:如果使用相关的Spring Boot入门程序,则不需要此配置。

要关联内容,请将Spring Content批注添加到您的User实体。

User.java

@Entity
public class User {

   ...

   // replace @Lob/byte array field with:

   @ContentId
   private String contentId;

   @ContentLength
   private long contentLength = 0L;

   @MimeType
   private String mimeType;

为图像创建头像“商店”:

AvatarStore.java

public interface AvatarStore extends ContentStore<User, String> {
}

这就是创建响应内容类型的REST端点@ /users/{userId}所需的全部。当您的应用程序启动时,Spring Content将查看您的依赖项(请参阅Spring Content JPA / REST),查看您的AvatarStore接口,并为JPA注入该接口的实现。它还将注入一个@Controller来将http请求转发到该实现。这省去了您自己实施任何此类操作的麻烦。

所以...

curl -X POST /users/{userId} -F 'data=@path/to/local/file.jpg'

将化身path/to/local/file.jpg存储在数据库中,并将其与ID为userId的用户实体相关联。

curl /users/{usersId} -H 'Accept: image/jpg'

将再次获取它,依此类推...支持完整的CRUD(顺便说一下,视频流也是如此)

[入门指南和视频here。 Spring Content JPA的参考指南为here

HTH

© www.soinside.com 2019 - 2024. All rights reserved.