将pdf上传到Postgres的问题

Posted

技术标签:

【中文标题】将pdf上传到Postgres的问题【英文标题】:Issue with uploading pdf into Postgres 【发布时间】:2019-06-28 11:34:43 【问题描述】:

我正在尝试使用 Hibernate 将 pdf 文档保存到我的 postgres 10.1 数据库中。 下面是我的实体类。

@Entity
@Table(name = "FILEUPLOADS", schema="SomeSchema")
public class FileUploads
//skipping other columns

@Lob
@Column(name="DOCDATA")
private byte[] docData;


此列是postgres数据库中的op类型bytea

正如 Authur 在这里所建议的:similar issue,我创建了我的 postgres 方言的自定义实现,如下所示。

@Configuration
public class TestDialect extends PostgreSQLDialect
    public TestDialect() 
        super();

        registerColumnType(Types.BLOB, "bytea");
    


然后在我的 persistence.xml 文件中,我正在使用这种自定义方言

<property name="hibernate.dialect" value="com.digital.repository.TestDialect" />

即使做了所有这些,我仍然遇到错误

ERROR: column "DOCDATA" is of type bytea but expression is of type bigint
  Hint: You will need to rewrite or cast the expression.
  Position: 251
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2468)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2211)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:309)
        at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:446)
        at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:370)
        at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:149)
        at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:124)
        at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
        ... 250 more

为了解决这个问题,我还需要做什么?

【问题讨论】:

别这样。使用专为此目的设计的数据库保存您的大二进制文件:文件系统。然后将文件名保存在您的数据库中。 @JonathonReinhart 你将如何处理事务? @Simon 不需要。确保该文件存在于磁盘上,然后插入到数据库中。删除时颠倒顺序。如果查询总是从数据库开始,你将永远看不到没有后备文件的记录。 【参考方案1】:

尝试改变休眠类型:

@Entity
@Table(name = "FILEUPLOADS", schema="SomeSchema")
public class FileUploads
//skipping other columns

@Type(type = "org.hibernate.type.BinaryType")
@Column(name="DOCDATA")
private byte[] docData;


【讨论】:

甲骨文???你说的是PostgreSQL! Oracle 有 BLOB 数据类型,你必须使用 @LOB 注释 再一次,我必须为 oracle 和 postgres 维护单一代码库 :-) 无论如何我都会尝试这个。谢谢!【参考方案2】:

以下配置对我有用,我现在可以将 doc/pdf 保存到数据库中。

@Configuration
public class CustomPostgresDialect extends PostgreSQL82Dialect

    @Override
    public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) 
    if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB) 
      return BinaryTypeDescriptor.INSTANCE;
    
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  

休眠 4.1.10

Java 1.7

【讨论】:

以上是关于将pdf上传到Postgres的问题的主要内容,如果未能解决你的问题,请参考以下文章

从 Postgres 返回图像 url 到前端 - Node / React

text #ogr2ogr上传到#postgres

如何将存储在 Postgres 中的图像的图像 URL 插入 Spring Boot 模型

如何有效地将 Postgres 数据从 Query 传输到 S3

无法使用 Heroku postgres 将数据添加到 Spring Boot 上的数据库

无法在heroku上恢复postgres转储