在項目設計的時候,公司使用的第三方的soaoffice在線編輯文檔,雖然soaoffice打開文件的時候,不會從客戶端html代碼中獲取到文檔的真實路徑,但是爲了文檔的安全,文檔存放目錄還是沒有放在Web項目的目錄下。從soaoffice的例子代碼中沒有看到有打開“非Web項目目錄”中文件的例子代碼,但是對soaoffice做了一下研究之後,發現soaoffice是支持這個功能的,在windows下開發的時候打開其他磁盤目錄下的文件也是可以的。用一個小例子大家一起分享,下載地址:http://ishare.iask.sina.com.cn/f/10293911.html。
Soaoffice打開文件的原理:
調用WebOpen方法打開文件,開發幫助中是這樣說的:
方法:function WebOpen(Document, WorkMode, UserName, ProgID); 功能:該函數使用HTTP協議從URL直接打開文件。 說明:Document:字符串類型,是相對於當前頁面的文檔路徑。 |
經研究發現,其實就是WebOpen的第一個參數是下載文件的相對路徑,不一定是什麼.doc的文件,動態頁也是可以的,在本例子中使用的是downfile.jsp,也就代碼中這樣寫的:
SOACtrl.webOpen("downfile.jsp", 1, "somebody", "Word.Document");
只要寫出來一個downfile.jsp的動態頁,訪問downfile.jsp可以下載word文件就大功告成了,用上面的代碼,肯定可以打開那個word文件。(如果不能打開文件的時候可以用這個方法調試,看看動態頁到底能不能下載一個正常的文件)
Soaoffice保存文件的原理:
在打開文件的方法WebOpen執行之前,soaoffice總是會給SaveDocURL屬性賦值,SaveDocURL屬性的詳細說明看開發幫助,SaveDocURL屬性的作用就是:通知控件在用戶點保存時,把文件流提交到哪個服務器頁面處理接收和保存工作。其實就是相當於form中的action的作用,在表單提交的時候,數據提交到action指向的頁。
在SaveDocURL屬性指向的頁面中創建SOAOfficeX.SaveDocObj就可以獲取到文件流,然後處理文檔的保存工作。SOAOfficeX.SaveDocObj有一個現成的保存流到磁盤的方法saveToFile,這個方法的參數是一個絕對地址的磁盤路徑,只要保證這個路徑跟打開的文件磁盤路徑一樣,那麼在客戶端點保存的時候,自然就更新文件了;要是這個路徑跟打開的文件磁盤路徑不一樣,那就等於另存文件功能了。提醒:saveToFile不能創建目錄,如果目錄不存在,結果只能是保存失敗。
關鍵代碼說明:
/////////////////////////////////////////////////
Simple.jsp: 打開文件頁
/////////////////////////////////////////////////
SOAOfficeX.SOAOfficeCtrl SOACtrl = new SOAOfficeX.SOAOfficeCtrl(pageContext);
// 設置SOAOFFICE中間件服務頁面
SOACtrl.ServerURL = "/soaservlet/soaserv.do";
SOACtrl.MenubarStyle = 5;
SOACtrl.SaveDocURL = "savefile.jsp"; // 保存文件工作由 savefile.jsp處理
SOACtrl.webOpen("downfile.jsp", 1, "somebody", "Word.Document"); //下載文件工作由downfile.jsp處理
/////////////////////////////////////////////////
Downfile.jsp: 下載文件
/////////////////////////////////////////////////
String filePath = "D://111//test.doc";
重點是這句,其他的代碼實現了文件的下載功能,這裏的filePath是本例子中測試使用的文件路徑,要保證這個 filePath 和savefile.jsp中的 filePath值一樣才能保存文件。
/////////////////////////////////////////////////
Savefile.jsp: 保存文件
/////////////////////////////////////////////////
String filePath = "D://111//test.doc"; //要與 Downfile.jsp中的filePath一致
// 下面的代碼功能是保存文件到filePath位置
SOAOfficeX.SaveDocObj SOAObj = new SOAOfficeX.SaveDocObj(pageContext);
try{
SOAObj.saveToFile(filePath);
SOAObj.returnOK();
}
finally
{
SOAObj.close();
}