2015-08-15 107 views
2

我有一個Microsoft Access數據庫,其中包含一個OLE對象字段,其中包含一個Microsoft Word文檔。 我試圖找到代碼來檢索保存在OLE對象中的文件,以便用戶可以從我的JavaFx應用程序中的按鈕下載它,但我沒有成功。從MS Access中提取OLE對象(Word文檔)

我有以下但我不知道該做什麼之後。另外,inputStream始終爲空。

InputStream inputStream = res.getBinaryStream(6); 

回答

4

對於從數據庫中獲取二進制數據,您似乎處於正確的軌道上。下面的代碼對我的作品與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文檔

  1. 原始二進制格式,或
  2. 作爲一個真正的OLE(「包裝」)對象。

如果該字段包含原始二進制格式的文檔,那麼我們可以將文件重命名爲.docx並直接在Word中打開它。

但是,在我的情況下,它被存儲爲一個「包裝」的OLE對象,因爲我在Access中使用「插入對象...」將文檔嵌入到表格中。因此,.DOCX(字)文件,其原始形式是這樣的......

raw.png

...從數據庫中提取與它的 「OLE包裝」 周圍:

wrapped1.png

如果我們通過從數據庫中的OLE數據向下搜索,我們可以抵消0xA57看到原始的二進制數據的開始,在這種情況下:

wrapped2.png

因此,不幸的是,我們不能簡單地將OLE二進制數據保存到文件中,然後直接在Word中打開該文件,因爲它不是有效的Word文件。

刪除OLE「包裝器」可能會非常棘手。某些文件格式被設計爲忽略文件末尾的無關字節,所以像this answer(僅刪除OLE包裝的「前面部分」)中描述的方法可用於圖像文件格式,如BMP,JPEG,等等。不幸的是,Word文檔對文件末尾的「垃圾」沒有多少寬容,所以只要刪除OLE包裝的「前部」,仍然可能導致Word無法打開的文件。

+0

我明白了,所以我不能夠檢索文檔,看起來它是如何在word中,而不是它與getBinaryStream()的二進制形式? – whites

+0

如果文檔確實存儲爲OLE對象,則不適用。我已經更新了我的答案以嘗試解釋。 –