前言 ⑴ 電子閱覽室、計(jì)算機(jī)房、網(wǎng)吧等公共上機(jī)場(chǎng)所由于使用頻繁、維護(hù)滯后等原因,輸出系統(tǒng)如軟驅(qū)等設(shè)備受損的現(xiàn)象普遍,往往在你需要將加工后的數(shù)據(jù)輸出時(shí)才發(fā)現(xiàn)輸出設(shè)備不能工作而大為光火,并且許多計(jì)算機(jī)房為了節(jié)省成本,在聯(lián)網(wǎng)的計(jì)算機(jī)上并不配全必要的輸出設(shè)備。 ⑵ 電腦普及的同時(shí)使的人們對(duì)它的依賴越來越強(qiáng),很多辦公事務(wù)已經(jīng)離不開電腦。換句話說,辦公人員的電腦里開始存放著許多重要的辦公與私人數(shù)據(jù)。而這些數(shù)據(jù),在大多數(shù)情況下是唯一的,意即它們的擁有者并沒有把它們做一份副本存放在不同的電腦上,其安全性完全取決于它們的擁有者的電腦的穩(wěn)定性。 ⑶ Internet的普及拉近了人們之間的距離,讓人們交流變得更為便捷,但是我們每天需要在家庭、辦公室、網(wǎng)吧等不同場(chǎng)所上網(wǎng),怎樣才能持續(xù)對(duì)某份文檔進(jìn)行編輯處理呢?或許通過優(yōu)盤或者是移動(dòng)硬盤之類的移動(dòng)存儲(chǔ)設(shè)備能夠隨身攜帶這些資料,不過隨身多帶一個(gè)這樣的設(shè)備特別是移動(dòng)硬盤總歸不是很方便,而且不同的場(chǎng)所、不同的設(shè)備、不同的操作系統(tǒng)對(duì)優(yōu)盤或移動(dòng)硬盤的支持不盡相同,使用者的電腦水平也不盡相同。 …… 由于這些事實(shí),使的網(wǎng)絡(luò)存儲(chǔ)作為一種需要登上了舞臺(tái)。 目前實(shí)現(xiàn)網(wǎng)絡(luò)存儲(chǔ)的方式有很多種,比如電子郵件、FTP、網(wǎng)上鄰居、HTTP等等。其中,F(xiàn)TP功能最為強(qiáng)大,但使用起來卻稍顯復(fù)雜,一大堆設(shè)置足以讓許多人望而止步,尤其用戶數(shù)量不可預(yù)見時(shí),針對(duì)特殊需求用戶的設(shè)置將更加繁瑣;電子郵件是大家所熟悉的了,但在局域網(wǎng)內(nèi)部,財(cái)務(wù)、勞資等文件資料需通過這種方式交流不是好辦法,而且,當(dāng)你的文件足夠大時(shí)對(duì)郵件空間是個(gè)致命沖擊;網(wǎng)上鄰居通過在本機(jī)上指定共享的Web文件夾并放置文件,一定范圍內(nèi)的用戶可以訪問到這些文件,然而這種方式使用的范圍相當(dāng)有限,通常在同一個(gè)DNS段地址內(nèi)的用戶才能順利訪問,其它尤其是Internet上的用戶,很難使用,此外同電子郵件類似,它的使用也不直觀,很多時(shí)候你不得不在許多列表計(jì)算機(jī)上一層層展開搜索才有可能獲取你想要的資源! 以上所述這些網(wǎng)絡(luò)存儲(chǔ)方式還有一個(gè)共同的缺點(diǎn):即管理員對(duì)存儲(chǔ)在網(wǎng)絡(luò)存儲(chǔ)中的文件的使用情況無法有一個(gè)比較清晰的了解,只能根據(jù)文件的存儲(chǔ)時(shí)間來決定是否對(duì)其進(jìn)行空間清理。 本文介紹一種通過HTTP實(shí)現(xiàn)的比較簡(jiǎn)單的網(wǎng)絡(luò)存儲(chǔ)方式。這種方式是在WINDOWS平臺(tái)上通過IIS與ASP/ASP.NET來實(shí)現(xiàn),不僅使用簡(jiǎn)單、可上載任意類型的文件,而且可以對(duì)使用者使用空間進(jìn)行限制,一次傳輸小到20字節(jié)、大到幾百兆都可以由管理者進(jìn)行管理,另外,文件的安全性也得到了保障,只有文件擁有者及得到授權(quán)者才可回載文件。讀懂本文第二大點(diǎn)中的數(shù)據(jù)結(jié)構(gòu)及第三大點(diǎn)中的上傳源碼,將幫助你自己做一個(gè)網(wǎng)絡(luò)存儲(chǔ),你就不必依賴于市場(chǎng)上提供的免費(fèi)網(wǎng)絡(luò)存儲(chǔ),使網(wǎng)絡(luò)內(nèi)部的敏感數(shù)據(jù)文件的安全牢牢掌握在自己手中。 概述與基本功能 安裝一臺(tái)作為網(wǎng)絡(luò)存儲(chǔ)宿主的服務(wù)器,操作系統(tǒng)采用windows平臺(tái),配套IIS5.0,設(shè)置好WEB服務(wù),在主網(wǎng)站下建立一個(gè)虛擬網(wǎng)站,指向網(wǎng)絡(luò)存儲(chǔ),如:d:\netspace\spacenet\myspace。所有的asp及asp.net源碼放置在主網(wǎng)站(如:c:\inetpub\wwwroot)下,d:\netspace\spacenet\myspace下將放置用戶上傳的文件(虛擬網(wǎng)站改變,在源碼中也應(yīng)作相應(yīng)調(diào)整)。 1、用到的基本數(shù)據(jù)庫及結(jié)構(gòu): ⑴ ftpsapce.mdb: 擁有表userlist, 表基本結(jié)構(gòu): Id:順序號(hào),自動(dòng)生成; Xh:用戶帳號(hào),注冊(cè)及驗(yàn)證生成; Xm:用戶姓名,注冊(cè)及驗(yàn)證生成; Kl:用戶口令,注冊(cè)及驗(yàn)證生成; Maxspace:用戶空間最高限額,注冊(cè)取默認(rèn)值,管理員可以通過管理重設(shè)定; Nowspace:用戶目前占用空間的數(shù)量; Lastaccessday:用戶最近一次存取時(shí)間,供管理員管理空間時(shí)參考; Fromday:用戶注冊(cè)時(shí)間; Checkx:用戶驗(yàn)證已否標(biāo)志。 ⑵ Filelist.mdb:擁有表files,表基本結(jié)構(gòu): Id:順序號(hào),自動(dòng)生成; Filename:文件名,上載系統(tǒng)判斷生成; Fsize:文件大小數(shù)值; Xh:用戶帳號(hào); Upday:上載時(shí)間; Filescript:文件描述,是用戶上載時(shí)的文件的路徑及原文件名,供用戶加載時(shí)參考; 2、基本功能 ⑴ 用戶登錄主網(wǎng)站,進(jìn)入網(wǎng)站主頁面,給出用戶基本資料進(jìn)行用戶注冊(cè)。 ⑵ 管理員根據(jù)用戶注冊(cè)資料予以審核,設(shè)定用戶最大使用空間。 ⑶ 審核通過的用戶上傳文件到網(wǎng)絡(luò)存儲(chǔ)。系統(tǒng)判定用戶合法性及文件合法性,在數(shù)據(jù)庫中對(duì)用戶上傳的文件及用戶資料進(jìn)行登記。 ⑷ 審核過的用戶通過下載功能對(duì)自己上傳的文件進(jìn)行回載或刪除。 ⑸ 管理員根據(jù)用戶數(shù)據(jù)庫及文件數(shù)據(jù)庫對(duì)網(wǎng)絡(luò)空間進(jìn)行管理。 ⑹ 擴(kuò)展過的系統(tǒng)允許得到授權(quán)的用戶對(duì)授權(quán)用戶的上傳文件進(jìn)行下載。 上載模塊基本源碼 限于篇幅,本文僅給出上載模塊的基本源碼,需要更多源碼可通過E-mail向作者索取,源碼中以***開頭的行是作者為了讀者閱讀方便而加上的注釋。(以下摘自 upfile.aspx) <%@ Page Language="VB" Debug="true" %> <%@ import namespace="System.Data" %> <%@ import namespace="System.Data.oledb" %> <html> <script language="vbscript" runat="server"> sub uploadfile(sender as object, e as eventargs) if fileup.postedfile.contentlength<20 then errors.text="這么小的文件也要上傳,背背就可以了." fileinfo.visible=false exit sub else errors.text="檢驗(yàn)正常" fileinfo.visible=true end if *** 以上檢查上傳文件大小 respace.text="0" nowspace.text="0" *** respace指剩余空間,nowspace指已用空間 dim xh1 as string =user1.value dim kl1 as string =pass1.value *** xh1指帳號(hào),kl1指口令 dim objconnstr as string="provider=microsoft.jet.oledb.4.0;data source=" & server.mappath("ftpspace.mdb") *** 以上兩行在源碼中應(yīng)為同一語句 dim objconn as oledbconnection = new oledbconnection(objconnstr) dim sql1 as string="select * from userlist where xh='"+xh1+"' and kl='"+kl1+"'" dim objrscc as oledbcommand= new oledbcommand(sql1,objconn) objconn.open() dim objrs as oledbdatareader = objrscc.executereader() dim ix as integer=0 dim maxs as long dim nows as long while ix=0 if objrs.read() then if objrs.item("xh")=xh1 then if objrs.item("kl")=kl1 then if objrs.item("checkx")=1 then ix=ix+1 maxs=objrs.item("maxspace") nows=objrs.item("nowspace") end if end if end if else ix=-1 end if end while *** 以上判定帳號(hào)與口令是否合法 if ix<=0 then errors.text="帳號(hào)口令錯(cuò)!或用戶尚未通過認(rèn)證,請(qǐng)等待管理員認(rèn)證!" else if fileup.postedfile.contentlength>maxs-nows then if fileup.postedfile.contentlength>=maxs then errors.text="文件長(zhǎng)度大于賦予空間大小,不能上傳!" else errors.text="可用空間不足,請(qǐng)刪除舊文件!" end if *** 以上判定用戶空間的可用性 else dim obj4str as string="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("filelist.mdb") *** 以上兩行在源碼中為同一語句 dim obj4 as oledbconnection = new oledbconnection(obj4str) dim sql10 as string="select * from files" dim objrc1 as oledbcommand= new oledbcommand(sql10,obj4) obj4.open() dim objrsx as oledbdatareader = objrc1.executereader() dim fn11 as long =0 while objrsx.read() fn11=objrsx("filename") end while dim fn1 as string fn1=cstr(fn11+1) *** 以上為用戶上傳文件起一個(gè)唯一的主文件名 dim objc1str as string="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("filelist.mdb") *** 以上兩行在源碼中為同一語句 dim objc1 as oledbconnection = new oledbconnection(objc1str) dim sql3 as string="insert into files(filename,fsize, xh,filescript,upday) values("+cstr(fn1)+","+cstr(fileup.postedfile.contentlength)+",'" +xh1+"','"+fileup.postedfile.filename+"','"+cstr(now())+"')" *** 以上三行在源碼中為同一語句 objc1.open() dim objrs1 as oledbcommand=new oledbcommand(sql3,objc1) dim fn2 as string fn2="d:/netspace/spacenet/myspace/"&cstr(fn1)&".zip" *** 給出用戶上傳文件的絕對(duì)路徑及完整文件名 fsize.text=cstr(fileup.postedfile.contentlength) ftype.text=fileup.postedfile.contenttype fname.text=fileup.postedfile.filename username.text=user1.value fileup.postedfile.saveas(fn2) objrs1.ExecuteNonQuery() objrs.close dim sql5 as string="update userlist set nowspace ="+cstr(nows+fileup.postedfile.contentlength)+ ",lastaccessday='"+cstr(now())+"' where xh='"+xh1+"'" *** 以上兩行在源碼中為同一語句 dim objrnc as oledbcommand= new oledbcommand(sql5,objconn) objrnc.executenonquery() respace.text=cstr(maxs-nows-fileup.postedfile.contentlength)&"字節(jié)." nowspace.text=cstr(nows+fileup.postedfile.contentlength)&"字節(jié)." *** 以上作上傳動(dòng)作,并計(jì)算用戶的已用總空間及剩余總空間 end if end if end sub </script> <body> <form enctype="multipart/form-data" runat="server"> <table> <tr><td>帳號(hào):</td><td><input id="user1" runat="server"></td></tr> <tr><td>口令:</td><td><input type="password" id="pass1" runat="server"></td></tr> <tr><td>文件:</td><td><input type="file" id="fileup" runat="server"></td></tr> <tr><td></td><td><asp:button id="upload" onclick="uploadfile" text="上傳" runat="server"/></td></tr> </table> </form><hr> <div id="fileinfo" visible="false" runat="server"> 原文件名:<asp:label id="fname" runat="server"/><br> 字節(jié)大小:<asp:label id="fsize" runat="server"/><br> 文件類型:<asp:label id="ftype" runat="server"/><br> 用戶帳號(hào):<asp:label id="username" runat="server"/><br> 剩余空間:<asp:label id="respace" runat="server"/><br> 已用空間:<asp:label id="nowspace" runat="server"/><br> 上傳狀態(tài):<asp:label id="errors" runat="server"/> </div> *** 以上在瀏覽器中告訴用戶文件上傳前后的相關(guān)信息 </body> </html> 結(jié)束語 本文所述的方法基于無組件技術(shù),在文件的安全性及個(gè)人隱私方面考慮的比較多,最適合在windows server 2003配合IIS6.0平臺(tái)上使用,方法簡(jiǎn)單安全,稍加擴(kuò)展,如在userlist里添加用戶號(hào)、組號(hào),在files里添加組號(hào),即可對(duì)文件的權(quán)限進(jìn)行設(shè)定,可方便實(shí)現(xiàn)文件的網(wǎng)絡(luò)提交、驗(yàn)證、共享。配合磁盤陣列,則在數(shù)據(jù)安全方面將有質(zhì)的提升。
|