我有一個Microsoft Access數據庫,其中包含一個OLE對象字段,其中包含一個Microsoft Word文檔。 我試圖找到代碼來檢索保存在OLE對象中的文件,以便用戶可以從我的JavaFx應用程序中的按鈕下載它,但我沒有成功。從MS Access中提取OLE對象(Word文檔)
我有以下但我不知道該做什麼之後。另外,inputStream
始終爲空。
InputStream inputStream = res.getBinaryStream(6);
我有一個Microsoft Access數據庫,其中包含一個OLE對象字段,其中包含一個Microsoft Word文檔。 我試圖找到代碼來檢索保存在OLE對象中的文件,以便用戶可以從我的JavaFx應用程序中的按鈕下載它,但我沒有成功。從MS Access中提取OLE對象(Word文檔)
我有以下但我不知道該做什麼之後。另外,inputStream
始終爲空。
InputStream inputStream = res.getBinaryStream(6);
對於從數據庫中獲取二進制數據,您似乎處於正確的軌道上。下面的代碼對我的作品與UCanAccess 3.0.0 Java 7中,其中[文件]是Access表OLE Object
場下:
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文檔
如果該字段包含原始二進制格式的文檔,那麼我們可以將文件重命名爲.docx並直接在Word中打開它。
但是,在我的情況下,它被存儲爲一個「包裝」的OLE對象,因爲我在Access中使用「插入對象...」將文檔嵌入到表格中。因此,.DOCX(字)文件,其原始形式是這樣的......
...從數據庫中提取與它的 「OLE包裝」 周圍:
如果我們通過從數據庫中的OLE數據向下搜索,我們可以抵消0xA57看到原始的二進制數據的開始,在這種情況下:
因此,不幸的是,我們不能簡單地將OLE二進制數據保存到文件中,然後直接在Word中打開該文件,因爲它不是有效的Word文件。
刪除OLE「包裝器」可能會非常棘手。某些文件格式被設計爲忽略文件末尾的無關字節,所以像this answer(僅刪除OLE包裝的「前面部分」)中描述的方法可用於圖像文件格式,如BMP,JPEG,等等。不幸的是,Word文檔對文件末尾的「垃圾」沒有多少寬容,所以只要刪除OLE包裝的「前部」,仍然可能導致Word無法打開的文件。
我明白了,所以我不能夠檢索文檔,看起來它是如何在word中,而不是它與getBinaryStream()的二進制形式? – whites
如果文檔確實存儲爲OLE對象,則不適用。我已經更新了我的答案以嘗試解釋。 –