groovy - 在 java 中:如何使用 mime_type 'application/octet-stream' 从二进制数据 (BYTEA) 文件中识别文件扩展名/文件类型并保存到磁盘?
问题描述
从数据库迁移中,我们在 postgreSQL 数据库中有一个数据转储。任务是用 java 或 groovy 编写一个脚本,以便以正确的格式读出文件并将它们保存到服务器。对于某些文件,在“mime_type”列中指定了 mime_type(例如 application/pdf、image/png)。在这些情况下,我能够以正确的格式保存它们。(-> 将它们作为字节数组输入流读入,将它们保存为相应格式的文件)。
但是 90% 的文件都有 mime_type "application/octet-stream"。在这些情况下,我怀疑文件的类型或格式是未知的。为了能够以正确的格式保存它们(例如png的pdf),我需要能够找出文件可能是什么类型。然后相应地转换它们。
我已经尝试过 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-Part 除外。
文件以二进制数据格式(BYTEA,相当于 BLOB 的 postgres)保存。
有谁知道如何找出这些应用程序/八位字节流文件最初具有的格式,从数据库中的二进制数据列(BYTEA 格式)中提取它们并将文件保存/读取到磁盘,例如 pdf、docx ,还是png?
提前谢谢了!
解决方案
如果您不能依赖数据库的功能,则必须使用库。JDK 的检测功能或多或少与您使用的操作系统绑定,因此再次使用库将提供更稳定的结果。
这是使用Apache Tika的示例:
tika.detector.detect(TikaInputStream.get(row.data), new Metadata())
会给你mimetype。它可以直接处理结果集的数据。如果你只需要检测很多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())
}
推荐阅读
- java - 类关系问题在 JSON 中不返回某些数据
- android - 调用工具栏中的导航图标(android)
- javascript - “未找到并发命令”但全局安装
- openshift - 如何免费获取 openshift AspNetCore 3.0 映像
- javascript - 每次我运行这段代码时,我都会得到不同的输出
- python - 使用 pyinstaller 创建可执行文件后,Tkinter 标签不适合窗口
- javascript - 如何禁用访问对象的属性?JS
- javascript - 如何为我的词云动态设置 maxItems?
- haskell - 在haskell的列表中计算出现次数
- c# - Windows 应用保存的目标多字节代码页中不存在 Unicode 字符的映射