问题描述
我们有一个 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)
完成了任务。