2010-09-23 23:22 墳墓 (Brian Hsu)
話說 Apache Common VFS 是一套 Java 上面的虛擬檔案系統函式庫,簡單的來說,他可以將 HTTP、FTP 甚至是網路芳臨等不同的網路資源上的檔案,用一個統一的介面來操作。你唯一需要的就是提供給網址給這個函式庫,接下來就可以直接存取檔案。
由於單位內有些早期的程式,還是直接用 Java 裡的 HttpConnection 來硬幹一些圖片檔案抓取,甚至是剖析 MINE Type 之類的功能。
想當然爾,自己硬幹出來的程式品質不會好到哪裡去,而且也經常炸在莫名其妙的地方。相較之下,將這些功能改用 Common VFS 實作好像是比較合理的選擇。
於是今天下午我就稍微測試了一下,可是沒想到還是炸了。
我遇到的是這個狀況,以下這個簡單的程式,抓一般的網站上的圖片時都沒有問題,但只要一抓檔案管理局的圖片,就炸掉了。
import org.apache.commons.vfs.VFS val fsManager = VFS.getManager(); // 取得一般網站的測試圖片 val file1 = fsManager.resolveFile ("http://brianhsu.moe/Images/desk.jpg") // 取得檔案管理局的資料 val file2 = fsManager.resolveFile ("https://na.archives.gov.tw/") // 上面那行會噴出以下的 Exception // // org.apache.commons.vfs.FileSystemException: // Could not connect to HTTP server on "na.archives.gov.tw". //
後來找了半天才發現原來會造成這種現象的原因,是因為檔案管理局的憑證是行政院發的,而 Java 並沒有信任這個憑證機構(其實如果用 Firefox 連進上面的網址,你也會發現他和你講那個憑證是不被信認的,囧),導至連線失敗。
最簡單的方法就是依照這篇的說明,將你要連線的網站的憑證加到 Java 的 KeyStore 裡就可以了,接下來就可以很正常的使用 Common VFS 來抓檔案囉。
回響