繁体   English   中英

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

[英]How to read binary data which is in bytea-format from postgres-db in java (or groovy) and save as jpeg-file?

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

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

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

//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(), 0, temp.flatten().size())

    def systemSettings = SystemSettings.getInstance(application)

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

在从 db 中的元信息中识别出 mime 类型之后,它调用以下方法: 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)完成了这项工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM