我有一个 Microsoft Access 数据库,其中包含一个包含 Microsoft Word 文档的 OLE 对象字段。
我试图找到代码来检索保存在 OLE 对象中的文件,以便用户可以从我的 JavaFx 应用程序中的按钮下载它,但没有成功。
我有以下内容,但我不知道之后该怎么办。还,inputStream
始终为空。
InputStream inputStream = res.getBinaryStream(6);
在从数据库中获取二进制数据方面,您似乎走在正确的轨道上。以下代码适用于 Java 7 下的 UCanAccess 3.0.0,其中 [Doc] 是OLE Object
Access 表中的字段:
String sql = "SELECT Doc FROM OleTest WHERE ID=1";
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql)) {
rs.next();
InputStream inputStream = rs.getBinaryStream(1);
File f = new File("C:/Users/Gord/Desktop/thing.bin");
Files.copy(
inputStream,
f.toPath(),
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
现在的问题是该字段是否包含Word文档
- 以原始二进制格式,或
- 作为真正的 OLE(“包装”)对象。
如果该字段包含原始二进制格式的文档,那么我们只需将该文件重命名为 .docx 并直接在 Word 中打开它。
然而,在我的例子中,它被存储为“包装的”OLE 对象,因为我已使用 Access 本身中的“插入对象...”将文档嵌入到表中。因此,原始形式的 .docx(Word)文档看起来像这样......
...从数据库中提取,并带有“OLE 包装器”:
如果我们从数据库中向下搜索 OLE 数据,我们可以看到原始二进制数据的开头,在本例中为偏移量 0xA57:
因此,不幸的是,我们不能简单地将 OLE 二进制数据保存到文件中,然后直接在 Word 中打开该文件,因为它不是有效的 Word 文件。
删除 OLE“包装器”可能很棘手。某些文件格式旨在忽略文件末尾的无关字节,因此类似于中描述的方法这个答案 https://stackoverflow.com/a/19709053/2144390(它只是删除了 OLE 包装器的“前部”)可以与 BMP、JPEG 等图像文件格式一起使用。不幸的是,Word 文档不太容忍文件末尾的“垃圾”,因此只需删除OLE 包装器的“前部”仍然可能导致 Word 无法打开文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)