在 java 中:如何使用 mime_type 'application/octet-stream' 从二进制数据 (BYTEA) 文件中识别文件 extension/file 类型并保存到磁盘?
in java: How can i identify file extension/file type from file in binary data (BYTEA) with mime_type 'application/octet-stream' and save to disk?
从数据库迁移中,我们在 postgreSQL 数据库中有一个数据转储。
任务是在java或groovy中编写脚本,以便以正确的格式读取文件并将其保存到服务器。对于某些文件,在 'mime_type' 列中指定 mime_type(例如 application/pdf、image/png)。在这些情况下,我能够以正确的格式保存它们。
(->将它们作为字节数组输入流读入,将它们保存为相应格式的文件)。
但是90%的文件都有mime_type“application/octet-stream”。在这些情况下,我怀疑文件的类型或格式是未知的。为了能够以正确的格式保存它们(例如 pdf 或 png),我不知何故需要能够找出文件的类型。然后进行相应的转换。
我已经尝试了 URLConnection.guessContentTypeFromStream(inputStream) 方法,但这无法识别 mime_type。
GroovyRowResult[] fileInBinary = sql.rows("""
SELECT * FROM table_name WHERE id = 123456
""")
def temp = []
fileInBinary.each { GroovyRowResult row ->
temp << row.data
}
InputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) temp.flatten(), temp.flatten().size())
def mimeType = java.net.URLConnection.guessContentTypeFromStream(byteArrayInputStream)
println "guessed mime Type is: " + mimeType
..followed by code to save the file, which works when mime_type specifies file format, e.g. pdf, word, or png
此代码有效,但 guessContentType 部分除外。
文件以二进制数据格式保存(BYTEA,postgres相当于BLOB)。
有谁知道如何找出这些 application/octet-stream 文件最初的格式,从数据库中的二进制数据列(BYTEA 格式)中提取它们并 save/read 文件到磁盘,例如pdf、docx 还是 png?
非常感谢!
如果您不能依赖数据库的功能,则必须使用
图书馆。 JDK的检测特征或多或少与
您正在使用的操作系统,因此再次使用图书馆会提供更多
稳定的结果。
这是一个使用 Apache 的例子
蒂卡:
tika.detector.detect(TikaInputStream.get(row.data), new Metadata())
会给你模仿类型。它可以直接处理数据
结果集。如果你只需要检测许多 blos 上的 mimetype 和
不需要实际数据,然后考虑只阅读前几个
足以检测类型的数据块。
完整示例:
@Grapes([
@Grab('org.postgresql:postgresql:+'),
@Grab('org.apache.tika:tika-core:1.25'),
])
@GrabConfig(systemClassLoader=true)
import groovy.sql.Sql
import org.apache.tika.config.TikaConfig
import org.apache.tika.io.TikaInputStream
import org.apache.tika.metadata.Metadata
def db = Sql.newInstance("jdbc:postgresql://localhost/so65682432", "postgres", "postgres")
def tika = new TikaConfig()
db.eachRow("SELECT * FROM test") { row ->
println tika.detector.detect(TikaInputStream.get(row.image), new Metadata())
}
从数据库迁移中,我们在 postgreSQL 数据库中有一个数据转储。 任务是在java或groovy中编写脚本,以便以正确的格式读取文件并将其保存到服务器。对于某些文件,在 'mime_type' 列中指定 mime_type(例如 application/pdf、image/png)。在这些情况下,我能够以正确的格式保存它们。 (->将它们作为字节数组输入流读入,将它们保存为相应格式的文件)。
但是90%的文件都有mime_type“application/octet-stream”。在这些情况下,我怀疑文件的类型或格式是未知的。为了能够以正确的格式保存它们(例如 pdf 或 png),我不知何故需要能够找出文件的类型。然后进行相应的转换。
我已经尝试了 URLConnection.guessContentTypeFromStream(inputStream) 方法,但这无法识别 mime_type。
GroovyRowResult[] fileInBinary = sql.rows("""
SELECT * FROM table_name WHERE id = 123456
""")
def temp = []
fileInBinary.each { GroovyRowResult row ->
temp << row.data
}
InputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) temp.flatten(), temp.flatten().size())
def mimeType = java.net.URLConnection.guessContentTypeFromStream(byteArrayInputStream)
println "guessed mime Type is: " + mimeType
..followed by code to save the file, which works when mime_type specifies file format, e.g. pdf, word, or png
此代码有效,但 guessContentType 部分除外。
文件以二进制数据格式保存(BYTEA,postgres相当于BLOB)。
有谁知道如何找出这些 application/octet-stream 文件最初的格式,从数据库中的二进制数据列(BYTEA 格式)中提取它们并 save/read 文件到磁盘,例如pdf、docx 还是 png?
非常感谢!
如果您不能依赖数据库的功能,则必须使用 图书馆。 JDK的检测特征或多或少与 您正在使用的操作系统,因此再次使用图书馆会提供更多 稳定的结果。
这是一个使用 Apache 的例子 蒂卡:
tika.detector.detect(TikaInputStream.get(row.data), new Metadata())
会给你模仿类型。它可以直接处理数据
结果集。如果你只需要检测许多 blos 上的 mimetype 和
不需要实际数据,然后考虑只阅读前几个
足以检测类型的数据块。
完整示例:
@Grapes([
@Grab('org.postgresql:postgresql:+'),
@Grab('org.apache.tika:tika-core:1.25'),
])
@GrabConfig(systemClassLoader=true)
import groovy.sql.Sql
import org.apache.tika.config.TikaConfig
import org.apache.tika.io.TikaInputStream
import org.apache.tika.metadata.Metadata
def db = Sql.newInstance("jdbc:postgresql://localhost/so65682432", "postgres", "postgres")
def tika = new TikaConfig()
db.eachRow("SELECT * FROM test") { row ->
println tika.detector.detect(TikaInputStream.get(row.image), new Metadata())
}