使用WebDAV實現Office文檔在線編輯


Office的文檔處理能力是非常強大的,但是它是本地資源,在Office Web App尚未成熟前,仍需要使用本地能力來進行文檔編輯,可是現代的系統的主流卻是B/S,所以在B/S中調用本地的Office編輯的能力就非常重要。

目前還說,將Office編輯的能力與B/S結合起來的方法主流的方案有三種:

DsoFarmer OCX嵌入網頁在線編輯方案:在很多年前微軟發布了一段C++開發源代碼的OCX控件DsoFarmer,可以將嵌入到網頁上使用JAVASCRIPT進行交互,該控件可以使用本地的OFFICE能力實現在線的交互。該方案被眾多OA廠商采用,我現在開發的OA就是使用該方案進行Office文檔的在線處理。

使用Office Web App實現在線編輯方案:該方案是從2011 SharePoint中自帶的一種方式,后經過微軟改良后做為單獨的服務Office Web App來使用,它可以與微軟的產品,SharePoint,OneDriver,Exchange或第三方協同工作,但是經過實踐證實,如果需要使用訪方案讓自己第三方系統擁有在線編輯Office的能力,需要安裝SharePoint2013及以上版本,另外需要獨立的服務器,因為OWA是不能和其它第三方系統使用同一台服務器的。

使用WebDAV編輯方案:該方案實際是不是在線編輯,而是通過WebDAV協議進行交互,而IIS和OFFICE都實現了WebDAV的交互能力,所以能有了這個交互方案。該方案主要是通過在Web Server端配置WebDAV后直接使用Office編輯,它會自動通過SharePoint Workspace(安裝OFFICE時會自動安裝)進行WebDAV的謂語動作。本章就着重講解如何使用WebDAV進行Office編輯的方法。

操作系統:Windows 2008 R2

客戶端:Win7/Win8、IE7 、Office2010

首先需要配置操作系統,安裝WebDAV組件,默認Windows 2008 R2是不安裝的。我們需要安裝它,如圖所示:

image

安裝完成后在站點中使會多出WebDAV創做功能,該功能默認是關閉的,我們需要雙擊進去后打開它,如圖所示:

imageimage

添加WebDAV的規則,因為我們是做測試,先不考慮其它所以先將其配置為全部可以訪問,如果所示

image

接下來我們配置安全性,我們關掉默認的匿名訪問,而開啟Windows的訪問。

image

我們這里使用的是Windows帳號登陸,但是原來我的系統上的用戶都是在存在數據庫里的,我就寫了個程序自動同步數據庫里的用戶到Windows賬戶。我使用的是ASP.NET語言,所以我的程序要做一些改造,來適應該變化,代碼如下:

 public class UserManager     {         public UserManager()         {         }         /**/         /// <summary>         /// 創建IIS登錄帳號         /// </summary>         /// <param name="userName">登錄帳號</param>         /// <returns></returns>               public static bool CreateUser(string userName, string password)         {             try             {                 DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");                 DirectoryEntry NewUser = AD.Children.Add(userName, "user");//增加用戶名                 NewUser.Invoke("SetPassword", new object[] { password });//用戶密碼                 NewUser.Invoke("Put", new object[] { "FullName", userName });//用戶全稱                  NewUser.Invoke("Put", new object[] { "Description", password });//用戶詳細描述                 NewUser.Invoke("Put", "PasswordExpired", 0);//用戶下次登錄需更改密碼                 NewUser.Invoke("Put", "UserFlags", 66049);//密碼永不過期                 //NewUser.Invoke("Put", "HomeDirectory", Path); //主文件夾路徑                 //NewUser.Properties["UserFlags"].Add(0x0002);//禁用登錄帳號                 //NewUser.Properties["UserFlags"].Add(0x0040);//用戶不能更改密碼                 ArrayList arl = new ArrayList();                 arl.Add(0x0002);                 arl.Add(0x0040);                 arl.Add(0x10000);                 NewUser.Properties["UserFlags"].Value = arl.ToArray();                 //NewUser.Properties["UserFlags"].Add(0x10000);//用戶密碼永不到期                 NewUser.CommitChanges();                 DirectoryEntry ObjUser = AD.Children.Find("FarseeingSoftUsers", "group");                 if (ObjUser.Name != null)                 {                     ObjUser.Invoke("Add", new object[] { NewUser.Path.ToString() });                 }                 ObjUser.Close();                 AD.Close();                 return true;             }             catch             {                 return false;             }         }         /**/         /// <summary>         /// 修改IIS登錄帳號密碼         /// </summary>         /// <param name="userName">登錄帳號</param>         /// <param name="password">登錄密碼</param>         /// <returns></returns>         public static bool EditUser(string userName, string password)         {             try             {                 DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");                 DirectoryEntry ObjUser = AD.Children.Find(userName, "user");                 ObjUser.Invoke("SetPassword", password);                 ObjUser.CommitChanges();                 ObjUser.Close();                 AD.Close();                 return true;             }             catch             {                 return false;             }         }         /**/         /// <summary>         /// 刪除IIS登錄帳號         /// </summary>         /// <param name="userName">登錄帳號</param>         /// <returns></returns>         public static bool DelUser(string userName)         {             try             {                 DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");                 DirectoryEntry ObjUser = AD.Children.Find(userName, "user");//找得用戶                 AD.Children.Remove(ObjUser);//刪除用戶                 ObjUser.GetType();                 ObjUser.Close();                 AD.Close();                 return true;             }             catch             {                 return false;             }         }     }
通過簡單的配置和程序改造句到此我們的服務器就支持了WebDAV,我們可以在站點里放一個Office的文檔,比如一個word文件,然后用Office打開,輸入該網址,然后輸入用戶名密碼試一下,如圖所示
imageimage
image

此時我們會發現,保存變成了這個圖標:

image

點擊保存后,再到服務器端看看該文件,是不是已經被改變了。

到目前為之還是需要讓用戶知道我們的文件地址,然后用WORD打開,這很明顯是不現實的,接下來我們需要改造我們的頁面,以便讓用戶可以在網頁上點擊文件的連接自動打開OFFICE進行編輯。我們需要為頁面增加如下腳本:

         var contextPath = "/"; //測試時可以傳入固定值office文件相對根目錄路徑         function fnWebDAVFile(szPath) {             try {                 "undefined" == typeof contextPath && (contextPath = '');                 if (!fnWebDAVFile.oSharePoint) {                     // 操作系統必須安裝Office和其SharePoint組件才能使用,默認已經安裝                     try { fnWebDAVFile.oSharePoint = new ActiveXObject("SharePoint.OpenDocuments.3") } catch (e) {                         try { fnWebDAVFile.oSharePoint = new ActiveXObject("SharePoint.OpenDocuments.2") } catch (e) {                             try { fnWebDAVFile.oSharePoint = new ActiveXObject("SharePoint.OpenDocuments.1") } catch (e) {                                 alert("你沒有安裝Office的SharePoint.OpenDocuments組件");                             }                         }                     }                 }                 var o = fnWebDAVFile.oSharePoint, l = window.location,                 szPath = contextPath + szPath; //此處產生路徑                 o.editDocument(szPath);             } catch (e) { alert(e.message) }         }

在頁面中我們可以將鏈接改造成為:<a href=”javascript:fnWebDAVFile(文件URL)”>文件名</a>

測試一下頁面會是如下的效果,點擊修改按鈕:

image

會提示如下的警告框:

image

點擊確定后輸入您的WINDOWS帳號,即上面我們通過將數據庫中的用戶同步到WINDOWS帳號中的用戶名密碼,即可以進行編輯。

image

如果不希望顯示該警告框的話,需要在客戶端的IE地址中,將當前的域名加入到受信站點中,一般企業會用AD進行策略推送,如果您的公司沒有AD,那就只能跑到每台電腦前進行設置了。設置方法如下:

imageimage

到此,就可以實現從B/S系統的網頁中通過點擊文件連接實現調用OFFICE文件,通過WebDAV進行編輯保存了。

由於介紹本技術的相關內容的網站資源並不多,而且沒有一個完整的教程,在實踐過程中本人遇到了大量的問題,走了很多彎路,希望通過該文章幫助大家少走彎路,如果在實踐過程中遇到什么問題,歡迎加QQ:9808175進行交流。

關於前面提到的DsoFarmer OCX嵌入網頁在線編輯方案和Office Web App實現在線編輯方案兩種解決方案,我想抽時間寫一些文章將最佳實踐放上來分享給大家!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM