文件傳送常用的三種方式FTP、Email及“網(wǎng)上鄰居”都在一定程度上實現(xiàn)了文件數(shù)據(jù)的交流,但它們都主要面向“點對點”的傳送,無法實現(xiàn)“一塊空間,資源互見”的應用需求,這種基于“點對多”的共享模式需要尋求另外的傳輸途徑,網(wǎng)絡硬盤就是一種很好的解決方式。 常用傳輸方式及其在特定環(huán)境下面臨的困難 我們經(jīng)常有這樣的應用需求:通過網(wǎng)絡交換公共數(shù)據(jù)文件以實現(xiàn)資源共享,同時保護私有數(shù)據(jù)不被非法訪問,并使用簡單、直觀的方式操作。我們常用的文件傳輸FTP、Email郵件、網(wǎng)上鄰居都能實現(xiàn)文件的傳送。其中,"Ftp"功能最為強大,但使用起來卻稍顯復雜,一大堆設置足以讓許多人望而止步,尤其用戶數(shù)量不可預見時,針對特殊需求用戶的設置將更加繁瑣;"Email"是大家所熟悉的了,但它的傳送不僅需要你連入Internet,而且它的安全性也是個問題,在企業(yè)內(nèi)部,財務、勞資等文件資料需通過這種方式交流不是好辦法;"網(wǎng)上鄰居"是又一種傳送文件的方法,通過在本機上指定共享的Web文件夾并放置資源文件,一定范圍內(nèi)的用戶可以訪問到這些文件,然而這種方式使用的范圍相當有限,通常在同一個DNS段地址內(nèi)的用戶才能順利訪問,其它尤其是Internet上的用戶,很難使用,此外同Email類似,它的使用也不直觀,很多時候你不得不在許多列表計算機上一層層展開搜索才有可能獲取你想要的資源! 由此看來,以上三種方式雖然在一定程度上實現(xiàn)了文件數(shù)據(jù)的交流,但它們都主要面向"點對點"的傳送(你只能被動地等對方放置數(shù)據(jù)而不能主動"可視化"地索取),無法實現(xiàn)"一塊空間,資源互見"的應用需求,這種基于"點對多"的共享方式需要尋求另外的傳輸途徑,網(wǎng)絡硬盤就是一種很好的解決方式。 網(wǎng)絡硬盤的優(yōu)勢 網(wǎng)絡硬盤(也稱共享空間),是服務器上的一塊硬盤空間,在這里,如果你具備足夠的權限,你可以對它隨意操作,就象使用你的本地計算機一樣。要知道,這一切以Http的方式傳輸,以Web的形式展現(xiàn)在所有用戶面前,通過瀏覽器這種熟悉的方式訪問,這樣,"一塊空間,資源互見"的共享模式得以實現(xiàn)! 此外,網(wǎng)絡硬盤界面在客戶端運行,它允許用戶提交數(shù)據(jù)到服務器,然后在指定的范圍內(nèi)管理這些信息,這種處理模式大量使用在實際開發(fā)中,尤其是在構建交互式網(wǎng)絡文檔管理系統(tǒng)方面:網(wǎng)上考試系統(tǒng)、文件傳輸系統(tǒng)、新聞發(fā)布系統(tǒng)以及公司競標系統(tǒng)等方面都有大量應用! 以下使用Asp.net(Visual C#語言實現(xiàn))和Xml(可擴展標記語言)開發(fā)了這樣的網(wǎng)絡硬盤系統(tǒng)。關于程序的開發(fā)細節(jié)及代碼中使用的關鍵技術和難點,都有詳細的講解,參照這些說明,你完全可以開發(fā)出自己的網(wǎng)絡硬盤。
1、查看文件夾內(nèi)容 2、創(chuàng)建新文件夾同時可設置訪問權限 3、文件夾間的跳轉:進入下一級,返回上一級 4、上傳文件到指定文件夾 5、下載文件到本機或在線查看文件內(nèi)容 6、刪除文件或文件夾
程序一開始將進入指定的根文件夾(如\NetHard),這個文件夾下的內(nèi)容將通過數(shù)據(jù)綁定控件(DataGrid)來列表顯示,包括以下方面:類別(區(qū)別文件夾或文件)、名稱、權限(是否允許進入文件夾?是否可以下載文件?)、刪除(是否允許刪除文件或文件夾?)以及針對文件夾的創(chuàng)建者。這里,由于文件夾中內(nèi)容動態(tài)變化(你不知道什么時候就有用戶傳送了文件或新建了文件夾或刪除了它們),我們通過動態(tài)創(chuàng)建數(shù)據(jù)表DataTable來讀取指定文件夾下的內(nèi)容, 然后作為數(shù)據(jù)源與顯示控件DataGrid綁定,這樣,數(shù)據(jù)的顯示就總是適時的。創(chuàng)建動態(tài)表的函數(shù)如下: public DataTable Bind(string fullFolderPath)//創(chuàng)建數(shù)據(jù)表讀取文件夾內(nèi)容 這個方法取出指定文件夾下的內(nèi)容分別處理:如果是文件,就顯示"下載"鏈接指向服務器上文件的Url地址;對文件夾需要視保護與否及保護類型進一步區(qū)別處理:若"進入受限"則顯示"密封"導入到密碼驗證頁,"進入不受限"時修改查詢字符串,顯示"進入"鏈接指向初始顯示頁。 2、創(chuàng)建新文件夾及設置訪問權限: 輸入新文件夾名后,你就可以在當前路徑下創(chuàng)建新的文件夾,Asp.net下遠程創(chuàng)建新文件夾和在本地機操作完全一樣,非常的簡單,.Net的IO名字空間提供了專門的類庫Directory,通過調(diào)用其方法就可以實現(xiàn),語句如下: Directory.CreateDirectory(string directory) 其中,字符串directory表示新建文件夾的完整路徑,這個方法默認向所有用戶開放新文件夾的完全讀寫訪問權限。特殊地,對網(wǎng)絡硬盤共享根文件夾(程序中示例為"NetHard"文件夾,你可以更改它)的創(chuàng)建你還可以手動進行,對應地,你需要手動設置以開放此文件夾的寫入權限,在IIS下,你可以在"internet信息服務"下,對該文件夾執(zhí)行"權限向導"來設置訪問權限。 資源共享時應該考慮安全性。這里,你可以設置用戶對該文件夾的訪問權限,通過設置密碼,你可以指定是否允許用戶進入該文件夾,是否允許刪除該文件夾,或者兩者都禁止。這樣,你可以保護自己的文件,將它們獨占訪問或者限制在一個特定的范圍內(nèi)(這個范圍的成員應該知道你的密碼),這樣,產(chǎn)品研發(fā)部門可以共用一個文件夾,財務部門也通過同樣的方式共用另一個文件夾,不屬于這個部門的人員將限制訪問。當然,這樣的限制你也可以應用到單個文件上(這樣的應用似乎不多,程序未實現(xiàn))。 此外,為了管理這些文件夾,你需要保留它們的設置信息:文件夾名、位置、受限操作類型、密碼及創(chuàng)建人等。程序中將這些信息寫入一Xml文件(此為folder.xml文件),隨后對文件夾的各種管理操作均通過讀寫該xml文件來進行,以下方法就實現(xiàn)了新建文件夾時設置信息的存儲: public void CreateXmlOrAddFrag(string xmlFullPath,string 其中,參數(shù)fileFullPath是存儲文件夾信息的xml文件路徑,folderFullPath是此新文件夾路徑,owner是創(chuàng)建人名,password是密碼,type表示限制操作的類型("0"表示進入受限,"1"表示刪除受限)。在程序運行之初,存儲文件夾信息的folder.xml文件可能尚不存在,所以程序中首先判斷這個文件是否存在,不存在則動態(tài)創(chuàng)建這個文件,這之后新建文件夾時,將只需要添加文檔片段。這里,對Xml文件的讀寫通過DOM(文檔對象模型)來實現(xiàn),由于此處Xml文件不會太大,這種方式不會對內(nèi)存資源要求太高,速度也會很快! 3、對文件及文件夾的操作: 對文件的操作包括"下載"和"刪除"兩種,在上面列表顯示指定文件夾中內(nèi)容時,針對文件,有這樣的語句: dr[2]="<a href="+url+" target=_blank"+">下載</a>";//建立聯(lián)接地址
刪除文件很簡單,.Net的IO命名空間的File類庫有這樣的方法: File.Delete(string filename);其中,filename為文件的完整路徑 你需要注意的是,文件的刪除將不需要驗證,要防止文件被刪除,你需要依照下面的方式來進行。(當然,程序中為避免文件誤刪除提供了確認驗證,文件夾刪除也一樣!) 對文件夾的操作分為:進入或者刪除。如果文件夾在創(chuàng)建時被設置"進入受限"或者"刪除受限",用戶在執(zhí)行這樣的操作時將被要求密碼驗證,只有通過驗證才能完成相應的操作,這種方式保護了你的文件被非法訪問或刪除。 相對文件的刪除,文件夾的刪除程序要稍微復雜些,.Net的Directory類庫提供的方法Delete()只能刪除空文件夾,這就需要我們首先清空文件夾中內(nèi)容,然后才能完成這一操作,由于文件夾中還可能再包含有文件夾,我們通過遞歸調(diào)用來實現(xiàn)這一操作: //刪除文件夾的方法
其中,參數(shù)dir是待刪除文件夾的完整路徑。程序使用循環(huán)語句,查找文件夾中的內(nèi)容,是文件則直接刪除,如果是文件夾,則遞歸調(diào)用方法自身來刪除子文件夾,文件夾清空后再完成刪除操作。 4、文件上傳: 要實現(xiàn)網(wǎng)絡硬盤的功能,必須要有可供操作的文件,這些文件來自于客戶端的上傳(當然,服務器端也能提供這些文件,但這不是網(wǎng)絡硬盤的重點),過去我們實現(xiàn)文件的上傳,在Asp中通常是使用第一些文件上傳組件,比如Microsoft 的PostingAcceptor組件,另外還有第三方提供的一些付費組件(不過說真的,這些組件并不好用)。那時候想要自己開發(fā)這樣的文件上傳組件,相當繁瑣;而現(xiàn)在,.Net提供的類庫HttpPostedFile和HttpFilesCollection可以很容易地訪問上載到服務器的文件,同時使開發(fā)人員控制文件上載過程。其中的HttpPostedFile類封裝已經(jīng)上傳到服務器的文件對象,其方法和屬性提供對每個文件的內(nèi)容和屬性的訪問;HttpFileCollection類則為多個HttpPostedFile對象提供一個容器,用作保存上傳給服務器的數(shù)據(jù)結構的類,這樣你就可以利用被傳送的文件集合,該文件集合可通過其Files屬性從HttpRequest 對象訪問,一旦服務器接收了請求的整個內(nèi)容,該集合就可以訪問。這些內(nèi)置的組件使得Asp.net中實現(xiàn)文件上傳相當容易,甚至只需要幾行代碼就可以了!關于Asp.net中實現(xiàn)文件上傳的文章很多,這里不做專門的闡述,需要的話你可以參考那些文章,這里,只提示你需要注意以下幾點: 1)、客戶端表單的編碼類型Enctype 設置為multipart/form-data的MIME格式,提交表單使用Http的post方法,象下面這樣: <form id="form1" method="post" enctype="multipart/form-data/form-data"
2)、HttpInputFile控件運行在服務器端,設置runat=server,type=file ,象下面這樣: <INPUT id="fileUp" type="file" size="6" runat="server">
3)、要上傳多個文件,你可以布置多個HttpInputFile控件,然后使用HttpRequest.Files來獲取這些文件。 5、環(huán)境配置文件Web.config的處理: 在中文狀態(tài)下,你可能需要將全球化設置編碼由默認的"Utf-8"改為"gb2312",語句如下: <globalization 同時,Web.config默認設置的的文件大小限制可能并不能滿足你的需要,你或許需要將限制尺度放大一些。這通過修改參數(shù)maxRequestLength的值來實現(xiàn),如下所示: <!-- 設置可接受的最大字節(jié)數(shù) --> 6、隨時跟蹤"當前路徑"值: 程序中的另一個關鍵點是關于"當前路徑"的,由于你總是需要在不同的文件夾之間跳轉:點擊"進入"到達下一級文件夾,點擊"上一級文件夾"返回前一級文件夾;而所有這些文件夾的內(nèi)容都通過同一個頁面(Default.aspx)來顯示,這個顯示頁面被設置為始終顯示當前文件夾下內(nèi)容。在你傳送查詢字符串來調(diào)用它時,你需要在查詢字符串中包含當前路徑的完整表示,這在程序中通過設置一個靜態(tài)變量來實現(xiàn):public static string currFullPath=""; 當前路徑發(fā)生改變時,總是將這個路徑值傳送給這個靜態(tài)標量:currFullPath=Request["path"];這就使得這個靜態(tài)變量始終存儲著當前的路徑值,以這個靜態(tài)變量為查詢字符串調(diào)用顯示頁: Response.Redirect("Default.aspx?path="+currFullPath)就總能顯示當前文件夾下的內(nèi)容了! 參考資料: 《Asp.net程序員參考手冊》、《XML高級編程》、《C#高級編程》、微軟MSDN 運行環(huán)境: 程序在:Windows XP中文正式版、.Net Frameworks 正式版、Visual Studio.Net中文正式版下調(diào)試通過,在局域網(wǎng)(總部+多個異地子公司模式)上穩(wěn)定運行 |
溫馨提示:喜歡本站的話,請收藏一下本站!