熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET+XML打造網絡硬盤

2013-11-13 12:23:19  來源: .NET編程 

  文件傳送常用的三種方式FTPEmail及網上鄰居都在一定程度上實現了文件數據的交流但它們都主要面向點對點的傳送無法實現一塊空間資源互見的應用需求這種基於點對多的共享模式需要尋求另外的傳輸途徑網絡硬盤就是一種很好的解決方式

  常用傳輸方式及其在特定環境下面臨的困難

  我們經常有這樣的應用需求通過網絡交換公共數據文件以實現資源共享同時保護私有數據不被非法訪問並使用簡單直觀的方式操作我們常用的文件傳輸FTPEmail郵件網上鄰居都能實現文件的傳送其中Ftp功能最為強大但使用起來卻稍顯復雜一大堆設置足以讓許多人望而止步尤其用戶數量不可預見時針對特殊需求用戶的設置將更加繁瑣Email是大家所熟悉的了但它的傳送不僅需要你連入Internet而且它的安全性也是個問題在企業內部財務勞資等文件資料需通過這種方式交流不是好辦法網上鄰居是又一種傳送文件的方法通過在本機上指定共享的Web文件夾並放置資源文件一定范圍內的用戶可以訪問到這些文件然而這種方式使用的范圍相當有限通常在同一個DNS段地址內的用戶才能順利訪問其它尤其是Internet上的用戶很難使用此外同Email類似它的使用也不直觀很多時候你不得不在許多列表計算機上一層層展開搜索才有可能獲取你想要的資源!

  由此看來以上三種方式雖然在一定程度上實現了文件數據的交流但它們都主要面向點對點的傳送(你只能被動地等對方放置數據而不能主動可視化地索取)無法實現一塊空間資源互見的應用需求這種基於點對多的共享方式需要尋求另外的傳輸途徑網絡硬盤就是一種很好的解決方式

  網絡硬盤的優勢

  網絡硬盤(也稱共享空間)是服務器上的一塊硬盤空間在這裡如果你具備足夠的權限你可以對它隨意操作就象使用你的本地計算機一樣要知道這一切以Http的方式傳輸以Web的形式展現在所有用戶面前通過浏覽器這種熟悉的方式訪問這樣一塊空間資源互見的共享模式得以實現!

  此外網絡硬盤界面在客戶端運行它允許用戶提交數據到服務器然後在指定的范圍內管理這些信息這種處理模式大量使用在實際開發中尤其是在構建交互式網絡文檔管理系統方面網上考試系統文件傳輸系統新聞發布系統以及公司競標系統等方面都有大量應用!

  以下使用Aspnet(Visual C#語言實現)和Xml(可擴展標記語言)開發了這樣的網絡硬盤系統關於程序的開發細節及代碼中使用的關鍵技術和難點都有詳細的講解參照這些說明你完全可以開發出自己的網絡硬盤

  三網絡硬盤實現的功能

  我們的網絡硬盤實現了以下功能

  查看文件夾內容

  創建新文件夾同時可設置訪問權限

  文件夾間的跳轉進入下一級返回上一級

  上傳文件到指定文件夾

  下載文件到本機或在線查看文件內容

  刪除文件或文件夾

  開發細節及技術關鍵點

  查看文件夾內容

  程序一開始將進入指定的根文件夾(如\NetHard)這個文件夾下的內容將通過數據綁定控件(DataGrid)來列表顯示包括以下方面類別(區別文件夾或文件)名稱權限(是否允許進入文件夾?是否可以下載文件?)刪除(是否允許刪除文件或文件夾?)以及針對文件夾的創建者這裡由於文件夾中內容動態變化(你不知道什麼時候就有用戶傳送了文件或新建了文件夾或刪除了它們)我們通過動態創建數據表DataTable來讀取指定文件夾下的內容 然後作為數據源與顯示控件DataGrid綁定這樣數據的顯示就總是適時的創建動態表的函數如下

public DataTable Bind(string fullFolderPath)//創建數據表讀取文件夾內容
{
//以下是動態創建數據表的方法
DataTable dt=new DataTable();
DataRow dr;
//首先創建數據表結構
dtColumnsAdd(new DataColumn(typeSystemTypeGetType(SystemString)));//類型
dtColumnsAdd(new DataColumn(nameSystemTypeGetType(SystemString)));//名稱
dtColumnsAdd(new DataColumn(actionSystemTypeGetType(SystemString)));//操作
dtColumnsAdd(new DataColumn(ownerSystemTypeGetType(SystemString)));//創建人
//為每一行填充數據
foreach(string d in DirectoryGetFileSystemEntries(fullFolderPath)){
dr=dtNewRow();//建新行
string[] parts=dSplit(new char[]{\\});
string txt=parts[partsLength];//取最後一部分的字符串它將可能是文件名或文件夾
dr[]=txt;//名稱name
if(FileExists(d))//如果是文件
{
dr[]=文件;//類型type
int pos=currFullPathIndexOf(NetHard);
string relaUrl=currFullPathSubstring(pos);
string
url=http:///SharedSpace/+relaUrl+/+txt;//
為作者服務器地址你應該將它修改為你所在服務器地址
dr[]=<a href=+url+ target=_blank+>下載</a>;
}
else if(DirectoryExists(d)){//如果是文件夾
dr[]=文件夾;//type類型
string password=GetFolderPassword(d);//取得文件夾密碼信息
int type=GetFolderLimitType(d);
if((password!=no)&&(type!=))
dr[]=<a
href=PasswordValidateaspx?path=+d+>密封</a>;//操作action
else
dr[]=<a href=Defaultaspx?path=+d+>進入</a>;//操作action
dr[]=GetFolderOwner(d);//取文件夾創建者名
}
else
ResponseWrite(<script>alert(無對象可綁定!)</script>);
dtRowsAdd(dr);//添加行
return dt;//返回數據表
}
}

  這個方法取出指定文件夾下的內容分別處理如果是文件就顯示下載鏈接指向服務器上文件的Url地址對文件夾需要視保護與否及保護類型進一步區別處理進入受限則顯示密封導入到密碼驗證頁進入不受限時修改查詢字符串顯示進入鏈接指向初始顯示頁

  創建新文件夾及設置訪問權限

  輸入新文件夾名後你就可以在當前路徑下創建新的文件夾Aspnet下遠程創建新文件夾和在本地機操作完全一樣非常的簡單Net的IO名字空間提供了專門的類庫Directory通過調用其方法就可以實現語句如下

DirectoryCreateDirectory(string directory)

  其中字符串directory表示新建文件夾的完整路徑這個方法默認向所有用戶開放新文件夾的完全讀寫訪問權限特殊地對網絡硬盤共享根文件夾(程序中示例為NetHard文件夾你可以更改它)的創建你還可以手動進行對應地你需要手動設置以開放此文件夾的寫入權限在IIS下你可以在internet信息服務對該文件夾執行權限向導來設置訪問權限

  資源共享時應該考慮安全性這裡你可以設置用戶對該文件夾的訪問權限通過設置密碼你可以指定是否允許用戶進入該文件夾是否允許刪除該文件夾或者兩者都禁止這樣你可以保護自己的文件將它們獨占訪問或者限制在一個特定的范圍內(這個范圍的成員應該知道你的密碼)這樣產品研發部門可以共用一個文件夾財務部門也通過同樣的方式共用另一個文件夾不屬於這個部門的人員將限制訪問當然這樣的限制你也可以應用到單個文件上(這樣的應用似乎不多程序未實現)

  此外為了管理這些文件夾你需要保留它們的設置信息文件夾名位置受限操作類型密碼及創建人等程序中將這些信息寫入一Xml文件(此為folderxml文件)隨後對文件夾的各種管理操作均通過讀寫該xml文件來進行以下方法就實現了新建文件夾時設置信息的存儲

public void CreateXmlOrAddFrag(string xmlFullPathstring
folderFullPathstring ownerstring passwordint type){
XmlDocument xmlDoc=new XmlDocument();
string xml=;
string xmlNode=<character>;
xmlNode+=<fullPath>;
xmlNode+=folderFullPath;
xmlNode+=</fullPath>;
xmlNode+=<owner>;
xmlNode+=owner;
xmlNode+=</owner>;
xmlNode+=<password>;
xmlNode+=password;
xmlNode+=</password>;
xmlNode+=<type>;
xmlNode+=type;
xmlNode+=</type>;
xmlNode+=</character>;
if(!FileExists(xmlFullPath)){//不存在則創建xml存儲文件
xml=<?xml version= encoding=gb?>;
xml+=<folder>;
xml+=xmlNode;
xml+=</folder>;
xmlDocLoadXml(xml);
xmlDocSave(xmlFullPath);//存儲文件
}
else{//存在xml存儲文件則添加新的文檔片段
xmlDocLoad(xmlFullPath);
XmlDocumentFragment
docFrag=xmlDocCreateDocumentFragment();//文檔片元素節點
docFragInnerXml=xmlNode;
XmlNode currNode=xmlDocDocumentElement;//獲取文檔根節澱
currNodeInsertBefore(docFragcurrNodeFirstChild);//插入文檔段
xmlDocSave(xmlFullPath);//存儲改變
}
}

  其中參數fileFullPath是存儲文件夾信息的xml文件路徑folderFullPath是此新文件夾路徑owner是創建人名password是密碼type表示限制操作的類型(表示進入受限表示刪除受限)在程序運行之初存儲文件夾信息的folderxml文件可能尚不存在所以程序中首先判斷這個文件是否存在不存在則動態創建這個文件這之後新建文件夾時將只需要添加文檔片段這裡對Xml文件的讀寫通過DOM(文檔對象模型)來實現由於此處Xml文件不會太大這種方式不會對內存資源要求太高速度也會很快!

  對文件及文件夾的操作

  對文件的操作包括下載刪除兩種在上面列表顯示指定文件夾中內容時針對文件有這樣的語句

dr[]=<a href=+url+ target=_blank+>下載</a>;//建立聯接地址

  其中url是指定文件對應的服務器路徑 通過這樣的鏈接將文件定位到服務器上的對應位置視文件格式的不同客戶端可以下載文件到本機上也可以就在服務器上打開它

  刪除文件很簡單Net的IO命名空間的File類庫有這樣的方法

FileDelete(string filename)其中filename為文件的完整路徑

  你需要注意的是文件的刪除將不需要驗證要防止文件被刪除你需要依照下面的方式來進行(當然程序中為避免文件誤刪除提供了確認驗證文件夾刪除也一樣!)

  對文件夾的操作分為進入或者刪除如果文件夾在創建時被設置進入受限或者刪除受限用戶在執行這樣的操作時將被要求密碼驗證只有通過驗證才能完成相應的操作這種方式保護了你的文件被非法訪問或刪除

  相對文件的刪除文件夾的刪除程序要稍微復雜些Net的Directory類庫提供的方法Delete()只能刪除空文件夾這就需要我們首先清空文件夾中內容然後才能完成這一操作由於文件夾中還可能再包含有文件夾我們通過遞歸調用來實現這一操作

//刪除文件夾的方法
public void DeleteFolder(string dir)
{
foreach(string d in DirectoryGetFileSystemEntries(dir))
{
if(FileExists(d))
FileDelete(d);//直接刪除其中的文件
else
DeleteFolder(d);//遞歸刪除子文件夾
}
DirectoryDelete(dir);//刪除已空文件夾
}

  其中參數dir是待刪除文件夾的完整路徑程序使用循環語句查找文件夾中的內容是文件則直接刪除如果是文件夾則遞歸調用方法自身來刪除子文件夾文件夾清空後再完成刪除操作

  文件上傳

  要實現網絡硬盤的功能必須要有可供操作的文件這些文件來自於客戶端的上傳(當然服務器端也能提供這些文件但這不是網絡硬盤的重點)過去我們實現文件的上傳在Asp中通常是使用第一些文件上傳組件比如Microsoft 的PostingAcceptor組件另外還有第三方提供的一些付費組件(不過說真的這些組件並不好用)那時候想要自己開發這樣的文件上傳組件相當繁瑣而現在Net提供的類庫HttpPostedFile和HttpFilesCollection可以很容易地訪問上載到服務器的文件同時使開發人員控制文件上載過程其中的HttpPostedFile類封裝已經上傳到服務器的文件對象其方法和屬性提供對每個文件的內容和屬性的訪問HttpFileCollection類則為多個HttpPostedFile對象提供一個容器用作保存上傳給服務器的數據結構的類這樣你就可以利用被傳送的文件集合該文件集合可通過其Files屬性從HttpRequest 對象訪問一旦服務器接收了請求的整個內容該集合就可以訪問這些內置的組件使得Aspnet中實現文件上傳相當容易甚至只需要幾行代碼就可以了!關於Aspnet中實現文件上傳的文章很多這裡不做專門的闡述需要的話你可以參考那些文章這裡只提示你需要注意以下幾點

  )客戶端表單的編碼類型Enctype 設置為multipart/formdata的MIME格式提交表單使用Http的post方法象下面這樣

<form id=form method=post enctype=multipart/formdata/formdata
runat=server

  )HttpInputFile控件運行在服務器端設置runat=servertype=file 象下面這樣

<INPUT id=fileUp type=file size= runat=server

  )要上傳多個文件你可以布置多個HttpInputFile控件然後使用HttpRequestFiles來獲取這些文件

  環境配置文件Webconfig的處理

  在中文狀態下你可能需要將全球化設置編碼由默認的Utf改為gb語句如下

<globalization
requestEncoding=gb
responseEncoding=gb
/>

  同時Webconfig默認設置的的文件大小限制可能並不能滿足你的需要你或許需要將限制尺度放大一些這通過修改參數maxRequestLength的值來實現如下所示

<! 設置可接受的最大字節數
<httpRuntime maxRequestLength=
</httpRuntime>

  隨時跟蹤當前路徑

  程序中的另一個關鍵點是關於當前路徑由於你總是需要在不同的文件夾之間跳轉點擊進入到達下一級文件夾點擊上一級文件夾返回前一級文件夾而所有這些文件夾的內容都通過同一個頁面(Defaultaspx)來顯示這個顯示頁面被設置為始終顯示當前文件夾下內容在你傳送查詢字符串來調用它時你需要在查詢字符串中包含當前路徑的完整表示這在程序中通過設置一個靜態變量來實現public static string currFullPath= 當前路徑發生改變時總是將這個路徑值傳送給這個靜態標量

  currFullPath=Request[path];這就使得這個靜態變量始終存儲著當前的路徑值以這個靜態變量為查詢字符串調用顯示頁 ResponseRedirect(Defaultaspx?path=+currFullPath)就總能顯示當前文件夾下的內容了!

  參考資料

《Aspnet程序員參考手冊》《XML高級編程》《C#高級編程》微軟MSDN

  運行環境

  程序在Windows XP中文正式版.Net Frameworks 正式版Visual StudioNet中文正式版下調試通過在局域網(總部+多個異地子公司模式)上穩定運行


From:http://tw.wingwit.com/Article/program/net/201311/15800.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.