網絡硬盤開發技巧之ASP.NET+XML
文件傳送常用的三種方式FTP、Email及“網上鄰居”都在一定程度上實現了文件數據的交流,但它們都主要面向“點對點”的傳送,無法實現“一塊空間,資源互見”的應用需求,這種基于“點對多”的共享模式需要尋求另外的傳輸途徑,網絡硬盤就是一種很好的解決方式。常用傳輸方式及其在特定環境下面臨的困難我們經常有這樣的應用需求:通過網絡交換公共數據文件以實現資源共享,同時保護私有數據不被非法訪問,并使用簡單、直觀的方式操作。
英國Ewedrive提供1GB的免費存儲空間,比較好的是它不限制單個文件大小。
我們常用的文件傳輸FTP、Email郵件、網上鄰居都能實現文件的傳送。其中,"Ftp"功能最為強大,但使用起來卻稍顯復雜,一大堆設置足以讓許多人望而止步,尤其用戶數量不可預見時,針對特殊需求用戶的設置將更加繁瑣;"Email"是大家所熟悉的了,但它的傳送不僅需要你連入Internet,而且它的安全性也是個問題,在企業內部,財務、勞資等文件資料需通過這種方式交流不是好辦法;"網上鄰居"是又一種傳送文件的方法,通過在本機上指定共享的Web文件夾并放置資源文件,一定范圍內的用戶可以訪問到這些文件,然而這種方式使用的范圍相當有限,通常在同一個DNS段地址內的用戶才能順利訪問,其它尤其是Internet上的用戶,很難使用,此外同Email類似,它的使用也不直觀,很多時候你不得不在許多列表計算機上一層層展開搜索才有可能獲取你想要的資源!由此看來,以上三種方式雖然在一定程度上實現了文件數據的交流,但它們都主要面向"點對點"的傳送(你只能被動地等對方放置數據而不能主動"可視化"地索取),無法實現"一塊空間,資源互見"的應用需求,這種基于"點對多"的共享方式需要尋求另外的傳輸途徑,網絡硬盤就是一種很好的解決方式。
onedump
OneDump存儲空間還是無限制大小的,不過單個文件只有最大5MB,且同時傳出10個文件,可用于存儲一些文檔之類的東西。
網絡硬盤的優勢網絡硬盤(也稱共享空間),是服務器上的一塊硬盤空間,在這里,如果你具備足夠的權限,你可以對它隨意操作,就象使用你的本地計算機一樣。要知道,這一切以Http的方式傳輸,以Web的形式展現在所有用戶面前,通過瀏覽器這種熟悉的方式訪問,這樣,"一塊空間,資源互見"的共享模式得以實現!此外,網絡硬盤界面在客戶端運行,它允許用戶提交數據到服務器,然后在指定的范圍內管理這些信息,這種處理模式大量使用在實際開發中,尤其是在構建交互式網絡文檔管理系統方面:網上考試系統、文件傳輸系統、新聞發布系統以及公司競標系統等方面都有大量應用!以下使用asp.net(VisualC#語言實現)和Xml(可擴展標記語言)開發了這樣的網絡硬盤系統。關于程序的開發細節及代碼中使用的關鍵技術和難點,都有詳細的講解,參照這些說明,你完全可以開發出自己的網絡硬盤。
網絡硬盤開發:網絡硬盤實現的功能
我們的網絡硬盤實現了以下功能:
1、查看文件夾內容
2、創建新文件夾同時可設置訪問權限
3、文件夾間的跳轉:進入下一級,返回上一級
4、上傳文件到指定文件夾
5、下載文件到本機或在線查看文件內容
6、刪除文件或文件夾
網絡硬盤開發細節及技術關鍵點
1、查看文件夾內容
程序一開始將進入指定的根文件夾(如\NetHard),這個文件夾下的內容將通過數據綁定控件(DataGrid)來列表顯示,包括以下方面:類別(區別文件夾或文件)、名稱、權限(是否允許進入文件夾?是否可以下載文件?)、刪除(是否允許刪除文件或文件夾?)以及針對文件夾的創建者。這里,由于文件夾中內容動態變化(你不知道什么時候就有用戶傳送了文件或新建了文件夾或刪除了它們),我們通過動態創建數據表DataTable來讀取指定文件夾下的內容,然后作為數據源與顯示控件DataGrid綁定,這樣,數據的顯示就總是適時的。創建動態表的函數如下:
publicDataTableBind(stringfullFolderPath) //創建數據表讀取文件夾內容 { //以下是動態創建數據表的方法DataTabledt=newDataTable();DataRowdr; //首先創建數據表結構dt.Columns.Add(newDataColumn("type",System.Type.GetType("System.String"))); //類型dt.Columns.Add(newDataColumn("name",System.Type.GetType("System.String"))); //名稱dt.Columns.Add(newDataColumn("action",System.Type.GetType("System.String"))); //操作dt.Columns.Add(newDataColumn("owner",System.Type.GetType("System.String"))); //創建人//為每一行填充數據foreach(stringdinDirectory.GetFileSystemEntries(fullFolderPath)) { dr=dt.NewRow();//建新行string[]parts=d.Split(newchar[]{'\\'}); stringtxt=parts[parts.Length-1]; //取最后一部分的字符串,它將可能是文件名或文件夾dr[1]=txt; //名稱nameif(File.Exists(d)) //如果是文件 { dr[0]="文件"; //類型typeintpos=currFullPath.IndexOf("NetHard"); stringrelaUrl=currFullPath.Substring(pos); stringurl="http://10.80.50.1/SharedSpace/"+relaUrl+"/"+txt; //10.80.50.1為作者服務器地址,你應該將它修改為你所在服務器地址dr[2]="下載"; } elseif(Directory.Exists(d)) { //如果是文件夾dr[0]="文件夾"; //type類型stringpassword=GetFolderPassword(d); //取得文件夾密碼信息inttype=GetFolderLimitType(d); if((password!="no")&&(type!=1)) dr[2]="href=PasswordValidate.aspx?path="+d+">密封"; //操作actionelsedr[2]="進入"; //操作actiondr[3]=GetFolderOwner(d);//取文件夾創建者名 } elseResponse.Write("");dt.Rows.Add(dr); //添加行returndt; //返回數據表 }
2、創建文件夾及設置訪問權限
在當前路徑下輸入新文件夾名稱來創建新文件夾,通過調用.net的IO名字空間中的類庫Directory方法來實現該操作:Directory.CreateDirectory(stringdirectory),字符串directory表示新建文件夾的完整路徑,該方法默認向所有用戶開放新文件夾的完全讀寫訪問權限。對于網絡硬盤共享根文件夾可手動進行創建,并設置寫入權限,通過執行"internet信息服務"的"權限向導"來設置訪問權限,可以設置密碼來指定是否允許用戶進入該文件夾以及是否允許用戶刪除該文件夾。此外,為了管理這些文件夾,需要保留相關設置信息:如文件夾名、位置、受限操作類型、密碼及創建者等。將這些信息寫入XML文件,隨后通過讀寫該XML文件來實現對文件夾的相關操作。
PublicvoidCreateXmlOrAddFrag (stringxmlFullPath,stringfolderFullPath,stringowner,stringpassword,inttype) { XmlDocumentxmlDoc=newXmlDocument(); stringxml=""; StringxmlNode="<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(!File.Exists(xmlFullPath)) { //若不存在則創建xml存儲文件xml="<?xmlversion=’1.0’encoding=’gb2312’?>"; xml+="<folder>"; xml+=xmlNode; xml+="</folder>"; xmlDoc.LoadXml(xml); xmlDoc.Save(xmlFullPath);//存儲文件 } else { //存在xml存儲文件則添加新的文檔片段xmlDoc.Load(xmlFullPath); XmlDocumentFragmentdocFrag=xmlDoc.CreateDocumentFragment(); //文檔片元素節點 docFrag.InnerXml=xmlNode; XmlNodecurrNode=xmlDoc.DocumentElement; //獲取文檔根節點currNode.InsertBefore(docFrag,currNode.FirstChild); //插入文檔片段xmlDoc.Save(xmlFullPath);//存儲改變內容 } }
其中,參數fileFullPath是存儲文件夾信息的XML文件路徑,folderFullPath是此新文件夾路徑,owner是創建者名,password是密碼,type表示限制操作的類型("0"表示進入受限,"1"表示刪除受限)。程序首先判斷存儲文件夾信息的文件是否存在,不存在則動態創建文件,之后新建文件夾時,只需添加文檔片段即可。這里,對XML文件的讀寫通過文檔對象模型DOM實現,由于此處XML文件不會很大,因此對內存資源要求不會太高,速度會很快。
3、對文件及文件夾的操作
對文件的操作包括"下載"和"刪除"兩種,用下面的語句實現下載功能:
dr[2]="<ahref="+url+"target=_blank"+">下載</a>";//建立聯接地址其中,url是指定文件對應的服務器路徑。通過這樣的鏈接將文件定位到服務器上的對應位置,客戶端可以下載文件到本機上,也可在服務器上打開它。
刪除文件則利用.NET的IO命名空間的File類庫中的方法實現:File.Delete(stringfilename);其中,filename為文件的完整路徑。
如果文件夾在創建時被設置為"進入受限"或者"刪除受限",用戶在執行這樣的操作時將被要求密碼驗證,只有通過驗證才能完成相應的操作。.NET的Directory類庫提供的方法Delete()只能刪除空文件夾,因此需要先清空文件夾中的內容,然后才能完成此操作。由于文件夾中可能還包含有文件夾,這里通過遞歸調用實現該操作:
PublicvoidDeleteFolder(stringdir) { Foreach(stringdinDirectory.GetFileSystemEntries(dir)) { If(File.Exists(d))File.Delete(d); //直接刪除其中的文件ElseDeleteFolder(d); //遞歸刪除子文件夾 } Directory.Delete(dir);//刪除已空文件夾 }
其中,參數dir是待刪除文件夾的完整路徑。程序使用循環語句,查找文件夾中的內容,若是文件則直接刪除,若是文件夾,則遞歸調用方法自身來刪除子文件夾,文件夾清空后再完成刪除操作。
4、文件上傳
.NET提供的類庫HttpPostedFile和HttpFilesCollection可以訪問上傳到服務器的文件,并且可以控制文件上傳過程。HttpPostedFile類封裝已上傳到服務器的文件對象,其方法和屬性提供對每個文件內容和屬性的訪問;HttpFilesCollection類為多個HttpPostedFile對象提供一個容器,保存上傳給服務器的數據結構的類,利用被傳送的文件集合的Files屬性從HttpRequest對象加以訪問。
1)客戶端表單的編碼類型Enctype設置為multipart/form-data的MIME格式,提交表單使用HTTP的post方法:
<Formid="form1"method="post"enctype="multipart/form-data/form-data"runat="server">
2)HttpInputFile控件運行在服務器端,設置方法如下:
<INPUTid="fileUp"type="file"size="6"runat="server">
3)如果要上傳多個文件,可設置多個HttpInputFile控件,然后利用HttpRequest.Files來分別獲取這些文件。
5、跟蹤"當前路徑"值
由于需要在不同的文件夾之間跳轉,而所有文件夾的內容都通過同一個頁面Default.ASPx來顯示,當傳送查詢字符串調用它時,可以設置一個靜態變量實現路徑的完整表示:publicstaticstringcurrFullPath=""。當前路徑發生改變時,將路徑值傳送給這個靜態變量,該變量始終存儲當前路徑值,用它作為查詢字符串調用顯示頁:currFullPath=Request["path"]。因此,利用Response.Redirect("Default.aspx?path="+currFullPath)語句總能顯示當前文件夾下的內容。
6、環境配置文件Web.config的處理
在中文狀態下,需要將全球化設置編碼由默認的"Utf-8"改為"gb2312":
<GlobalizationRequestEncoding="gb2312"ResponseEncoding="gb2312"/>
同時,考慮到Web.config默認設置的文件大小可能不能滿足實際需要,通過修改參數maxRequestLength的值,可將其尺度適當放大一些:
<HttpRuntimemaxRequestLength="500000"></httpRuntime>
結束語
asp.net技術與XML技術是當前網絡開發應用的熱點,在數據傳輸、信息發布、電子支付及網絡安全等諸多領域被廣泛應用。這里將相關技術結合起來用于網絡硬盤開發,實現系統資源共享,不僅可以滿足用戶的基本需求、操作簡便,而且可有效保護用戶私有數據不被非法訪問,具有一定安全性,便于維護,因此在文件傳輸系統、網上考試系統以及新聞發布系統等實際應用中,均可廣泛采用這種處理模式。