關鍵詞:ASP.NET; XML; 網絡硬盤; DOM; 服務器
引言
在傳輸文件時常常採用FTP、Email以及"網上鄰居"三種方式,這幾種方式各有優缺點。FTP功能強大,但使用起來較爲複雜,需要進行詳細設置滿足各種不同需求,當用戶數量不可預見時,設置會很繁瑣。Email使用方便,連入Internet就可進行文件傳輸,但安全性不高,對於比較重要的文件一般不採用此方式。"網上鄰居"通過在本機上指定共享的Web文件夾並放置資源文件,用戶在一定範圍內可以訪問這些文件,但是範圍相當有限,通常在同一個DNS段地址內的用戶才能順利訪問,並且在許多列表計算機上層層展開搜索來獲取資源也比較費時。以上幾種方式主要是"點對點"進行傳輸,對於"點對多"的共享模式則需要尋求另外的傳輸途徑,網絡硬盤便是一種較好的解決方式。只要用戶具備足夠權限,就可進行各種操作,如同使用本地計算機一樣。它以HTTP方式傳輸,以WEB形式展現在所有用戶面前,通過瀏覽器方式進行訪問,這樣,"一塊空間,資源互見"的共享模式得以實現。
網絡硬盤開發
ASP.NET是一種全新的服務器端技術,它採用CLR(Common Language Runtime)結構的程序設計平臺,可在服務器端生成功能強大的WEB應用程序,同時也可保留用戶完整的應用狀態,提供最佳的控制方式[1]。XML是數據訪問領域的新技術,具有自描述性、內容與顯示相分離、可擴展性、獨立於平臺等特點[2],提供了一套跨平臺、跨網絡、跨程序語言的數據描述方式,己逐漸成爲科學與業務應用中數據表示及應用的數據交換標準格式[3]。將這兩種技術結合起來,可開發出功能強大的網絡硬盤系統,例如可以查看文件夾內容,創建新文件夾以及設置訪問權限,對文件及文件夾進行相關操作,上傳文件到指定文件夾,下載文件到本機或在線查看文件內容等等。下面分別用C#語言實現相應功能。
1、查看文件夾內容
進入到指定的根文件夾,通過數據綁定控件Data Grid列表顯示該文件夾內容,包括類別、名稱、權限等。由於通過動態創建數據表Data Table讀取指定文件夾內容,並作爲數據源與顯示控件Data Grid綁定,因此數據的顯示是動態的。創建動態表的函數如下:
public Data Table Bind(string fullFolderPath)//創建數據表讀取文件夾內容
{
Data Table DT=new Data Table ();
Data Row dr;
//首先創建數據表結構
Dt.Columns.Add (new DataColumn ("type", System.Type.GetType ("System. String")));//類型
Dt.Columns.Add (new Data Column ("name", System.Type.GetType ("System. String")));//名稱
Dt.Columns.Add (new Data Column ("action", System.Type.GetType ("System. String")));//操作
Dt.Columns.Add (new Data Column ("owner", System.Type.GetType ("System. String")));//創建者
//爲每一行填充數據
For each (string d in Directory.GetFileSystemEntries (fullFolderPath)){
dr=dt.NewRow();//新建行
String [] parts=d. Split (new char []{’//’});
String txt=parts [parts. Length-1];
dr[1]=txt;//名稱name
if(File.Exists(d))//如果是文件
{
dr[0]="文件";//類型type
Int pos=currFullPath. IndexOf ("Net Hard");
String relaUrl=currFullPath. Substring (pos);
string url="http://202.115.64.13/SharedSpace/"+relaUrl+"/"+txt;//202.115.64.13爲服務器地址
dr[2]="<a href="+url+" target=_blank"+">下載</a>";
}
Else if (Directory. Exists(d)){//如果是文件夾
dr[0]="文件夾";//type類型
string password=GetFolderPassword(d);//取得文件夾密碼信息
Int type=GetFolderLimitType (d);
If ((password! ="no")&&(type! =1))
Dr [2]="<a href=PasswordValidate.aspx? path="+d+">密封</a>";//操作action
Else
Dr [2]="<a href=Default.aspx? path="+d+">進入</a>";//操作action
dr[3]=GetFolderOwner(d);//取文件夾創建者名
}
Else
Response.Write("<script>alert(’無對象可綁定!’)</script>");
dt.Rows.Add(dr);//添加行
return dt;//返回數據表
}
}
此方法取出指定文件夾下的內容分別處理:如果是文件,則顯示"下載"鏈接指向服務器文件的Url地址;對於文件夾,若是"進入受限"則顯示"密封"導入到密碼驗證頁,否則顯示"進入"鏈接到初始頁。
2、創建文件夾及設置訪問權限
在當前路徑下輸入新文件夾名稱來創建新文件夾,通過調用.NET的IO名字空間中的類庫Directory方法來實現該操作:Directory.CreateDirectory(string directory),字符串directory表示新建文件夾的完整路徑,該方法默認向所有用戶開放新文件夾的完全讀寫訪問權限。對於網絡硬盤共享根文件夾可手動進行創建,並設置寫入權限,通過執行"internet信息服務"的"權限嚮導"來設置訪問權限,可以設置密碼來指定是否允許用戶進入該文件夾以及是否允許用戶刪除該文件夾。此外,爲了管理這些文件夾,需要保留相關設置信息:如文件夾名、位置、受限操作類型、密碼及創建者等。將這些信息寫入XML文件,隨後通過讀寫該XML文件來實現對文件夾的相關操作。
Public void CreateXmlOrAddFrag (string xmlFullPath, string folderFullPath, string owner, string password, int type){
XmlDocument xmlDoc=new XmlDocument();
string xml="";
String xmlNode="<character>";
XmlNode+="<full Path>";
XmlNode+=folderFullPath;
XmlNode+="</full Path>";
XmlNode+="<owner>";
XmlNode+=owner;
XmlNode+="</owner>";
xmlNode+="<password>";
xmlNode+=password;
xmlNode+="</password>";
xmlNode+="<type>";
xmlNode+=type;
xmlNode+="</type>";
xmlNode+="</character>";
if(!File.Exists(xmlFullPath)){//若不存在則創建xml存儲文件
xml="<?xml version=’1.0’ encoding=’gb2312’?>";
xml+="<folder>";
xml+=xmlNode;
xml+="</folder>";
xmlDoc.LoadXml(xml);
xmlDoc.Save(xmlFullPath);//存儲文件
}
else{//存在xml存儲文件則添加新的文檔片段
xmlDoc.Load(xmlFullPath);
XmlDocumentFragment docFrag=xmlDoc.CreateDocumentFragment();//文檔片元素節點
docFrag.InnerXml=xmlNode;
XmlNode currNode=xmlDoc.DocumentElement;//獲取文檔根節點
currNode.InsertBefore(docFrag,currNode.FirstChild);//插入文檔片段
xmlDoc.Save(xmlFullPath);//存儲改變內容
}
}
其中,參數fileFullPath是存儲文件夾信息的XML文件路徑,folderFullPath是此新文件夾路徑,owner是創建者名,password是密碼,type表示限制操作的類型("0"表示進入受限,"1"表示刪除受限)。程序首先判斷存儲文件夾信息的文件是否存在,不存在則動態創建文件,之後新建文件夾時,只需添加文檔片段即可。這裏,對XML文件的讀寫通過文檔對象模型DOM實現,由於此處XML文件不會很大,因此對內存資源要求不會太高,速度會很快。
3、對文件及文件夾的操作
對文件的操作包括"下載"和"刪除"兩種,用下面的語句實現下載功能:
dr[2]="<a href="+url+" target=_blank"+">下載</a>";//建立聯接地址
其中,url是指定文件對應的服務器路徑。 通過這樣的鏈接將文件定位到服務器上的對應位置,客戶端可以下載文件到本機上,也可在服務器上打開它。
刪除文件則利用.NET的IO命名空間的File類庫中的方法實現:File. Delete(string filename);其中,filename爲文件的完整路徑。
如果文件夾在創建時被設置爲"進入受限"或者"刪除受限",用戶在執行這樣的操作時將被要求密碼驗證,只有通過驗證才能完成相應的操作。. NET的Directory類庫提供的方法Delete()只能刪除空文件夾,因此需要先清空文件夾中的內容,然後才能完成此操作。由於文件夾中可能還包含有文件夾,這裏通過遞歸調用實現該操作:
Public void Delete Folder (string dir)
{
For each (string d in Directory.GetFileSystemEntries (dir))
{
If (File. Exists (d))
File. Delete(d);//直接刪除其中的文件
Else
Delete Folder(d);//遞歸刪除子文件夾
}
Directory. Delete(dir);//刪除已空文件夾
}
其中,參數dir是待刪除文件夾的完整路徑。程序使用循環語句,查找文件夾中的內容,若是文件則直接刪除,若是文件夾,則遞歸調用方法自身來刪除子文件夾,文件夾清空後再完成刪除操作。
4、文件上傳
.NET提供的類庫HttpPostedFile和HttpFilesCollection可以訪問上傳到服務器的文件,並且可以控制文件上傳過程。HttpPostedFile類封裝已上傳到服務器的文件對象,其方法和屬性提供對每個文件內容和屬性的訪問;HttpFilesCollection類爲多個HttpPostedFile對象提供一個容器,保存上傳給服務器的數據結構的類,利用被傳送的文件集合的Files屬性從HttpRequest對象加以訪問。
1)客戶端表單的編碼類型Enctype 設置爲multipart/form-data的MIME格式,提交表單使用HTTP的post方法:
<Form id="form1" method="post" enctype="multipart/form-data/form-data" runat="server" >
2)HttpInputFile控件運行在服務器端,設置方法如下:
<INPUT id="file Up" type="file" size="6" runat="server">
3)如果要上傳多個文件,可設置多個HttpInputFile控件,然後利用HttpRequest.Files來分別獲取這些文件。
5、跟蹤"當前路徑"值
由於需要在不同的文件夾之間跳轉,而所有文件夾的內容都通過同一個頁面Default.aspx來顯示,當傳送查詢字符串調用它時,可以設置一個靜態變量實現路徑的完整表示:public static string currFullPath=""。當前路徑發生改變時,將路徑值傳送給這個靜態變量,該變量始終存儲當前路徑值,用它作爲查詢字符串調用顯示頁:currFullPath=Request["path"]。因此,利用Response. Redirect ("Default.aspx? path="+currFullPath) 語句總能顯示當前文件夾下的內容。
6、環境配置文件Web.config的處理
在中文狀態下,需要將全球化設置編碼由默認的"Utf-8"改爲"gb2312":
<Globalization
Request Encoding="gb2312"
Response Encoding="gb2312"
/>
同時,考慮到Web.config默認設置的文件大小可能不能滿足實際需要,通過修改參數maxRequestLength的值,可將其尺度適當放大一些:
<HttpRuntime maxRequestLength="500000">
</httpRuntime>
結束語
ASP.NET技術與XML技術是當前網絡開發應用的熱點,在數據傳輸、信息發佈、電子支付及網絡安全等諸多領域被廣泛應用。這裏將相關技術結合起來開發網絡硬盤,實現系統資源共享,不僅可以滿足用戶的基本需求、操作簡便,而且可有效保護用戶私有數據不被非法訪問,具有一定安全性,便於維護,因此在文件傳輸系統、網上考試系統以及新聞發佈系統等實際應用中,均可廣泛採用這種處理模式。