如何从java或groovy中的postgres-db读取bytea格式的二进制数据并保存为jpeg文件?

问题描述

我们有一个 postgres-DB-dump,其中所有类型的文件(png、jpg、pdf 等)都以 bytea 格式存储为二进制数据。我们必须将它们读出并使用 grooy 或 java 将它们作为文件(例如 .jpg)存储在服务器上。

问题在于所创建的文件已损坏(尽管在另一台服务器上的早期 db-dump 中使用了相同的代码)。未创建有效文件

带有 sql-query 的 db-column 中的数据如下所示:\x1f8b0800000000000000ed5adb6edb38107ddfaf10f45a14be245d20852320698316089214a9fb2c50d2d8264c912e49b5f57ecffec9fed892badf68c9 ... 每行 2048 字节。一些文件分布在多行..

//Get data from DB: binary data,mime_type,file_ID
    GroovyRowResult[] data = sql.rows("""
      SELECT lo.loid loid,lo.pageno pageno,lo.data d,nb.hash  hash,nb.size size,nb.mime_type mime_type,nb.data nb_loid,nb.file_extension ext FROM <tablename containing binary data> lo
      LEFT JOIN <tablename helptable Metainfo> nb ON lo.loid = nb.data
      WHERE lo.loid = $loid
      """)

    def fileId = data[0].loid.toString()
    def mimeType = data[0].mime_type.toString()
    def temp = []

    //read out binary data into a byte array
    data.each { GroovyRowResult row ->
      temp << row.d
    }
    //read the byte array into an input stream
    InputStream inputStream = new ByteArrayInputStream((byte[]) temp.flatten(),temp.flatten().size())

    def systemSettings = SystemSettings.getInstance(application)

    def newFileId = FileInBinaryFormat.detectTypeAndSave(<folderID on Server>,application.getRealPath(systemSettings.getDocumentPath()),fileId,mimeType,inputStream)

在从 db 中的元信息中识别出 mime-type 后调用以下方法: FileEntry 表示我们服务器上上传的文档。

  static String saveAsImage(InputStream inputStream,String fileName,Folder folder,String path,Connection conn,String fileExtension) {

    BufferedImage bufferedImage = null
    try {
      bufferedImage = ImageIO.read(inputStream)
   } catch (IOException e){
      ...
    }

    try{ 
      def newFile = new File(path,"${UniqueID.createHexId()}"+fileExtension)
      ImageIO.write(bufferedImage,fileExtension,newFile)
        def fileEntry = FileEntry.createNewEntry(newFile,conn,folder,Customer.getCustomer(<CustomerNumber>),"",fileName + fileExtension)
      return fileEntry.id   
    } catch (IOException e) {
      ...
    } 
  }

是否有人看到导致问题的一些明显错误或可以以任何方式帮助我?非常感谢提前!

编辑: 更多信息:

当记录“newFile”时,它会显示文件的路径。但是在服务器上的目录中没有找到文件。所以没有创建文件

缓冲图像的日志如下所示:

[Date:Time] BufferedImage@57c0c3cb: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@6bcd3bb4 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 277 height = 368 #numDataElements 3 dataOff[0] = 2

字节数组是以下形式的数组:[-1,125,5,6,...,](DB 列中十六进制值的有符号 2 补码)。所以这似乎有效。

我在查询添加了“Order BY pageno”以确保行的顺序正确。

解决方法

我找到了解决方案。问题出在 ImageIO.write(bufferedImage,fileExtension,newFile) 部分。变量“fileExtension”包含一个点:“.jpeg”、“.png”等。它必须没有点。因此,在更改并将上面的行更改为: def newFile = new File(path,UniqueID.createHexId()+"."+fileExtension) 完成了任务。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...