前言
⑴ 電子閱覽室、電腦房、網咖等公共上機場所由於使用頻繁、維護滯後等原因,輸出系統如軟驅等設備受損的現象普遍,往往在你需要將加工後的資料輸出時才發現輸出設備不能工作而大為光火,而且許多電腦房為了節省成本,在聯網的電腦上並不配全必要的輸出設備。
⑵ 電腦普及的同時使的人們對它的依賴越來越強,很多辦公室事務已經離不開電腦。換句話說,辦公人員的電腦裡開始存放著許多重要的辦公室與私人資料。而這些數據,在大多數情況下是唯一的,意即它們的擁有者並沒有把它們做一份副本存放在不同的電腦上,其安全性完全取決於它們的擁有者的電腦的穩定性。
⑶ Internet的普及拉近了人們之間的距離,讓人們交流變得更為便捷,但是我們每天需要在家庭、辦公室、網吧等不同場所上網,怎樣才能持續對某份文件進行編輯處理呢?或許透過優盤或是行動硬碟之類的行動儲存裝置能夠隨身攜帶這些資料,不過隨身多帶一個這樣的裝置特別是行動硬碟總歸不是很方便,而且不同的場所、不同的裝置、不同的作業系統對優盤或行動硬碟的支援不盡相同,使用者的電腦水準也不盡相同。
……
由於這些事實,使的網路儲存作為一種需求登上了舞台。
目前實現網路儲存的方式有很多種,例如電子郵件、FTP、網路芳鄰、HTTP等等。其中,FTP功能最為強大,但使用起來卻稍顯複雜,一大堆設定足以讓許多人望而止步,尤其用戶數量不可預見時,針對特殊需求用戶的設定將更加繁瑣;電子郵件是大家所熟悉的了,但在區域網路內部,財務、勞資等文件資料需透過這種方式交流不是好辦法,而且,當你的文件足夠大時對郵件空間是個致命衝擊;網上鄰居通過在本機上指定共享的Web資料夾並放置文件,一定範圍內的用戶可以訪問到這些文件,然而這種方式使用的範圍相當有限,通常在同一個DNS段地址內的用戶才能順利訪問,其它尤其是Internet上的用戶,很難使用,此外同電子郵件類似,它的使用也不直觀,很多時候你不得不在許多列表計算機上一層層展開搜索才有可能獲取你想要的資源! 以上所述這些網路儲存方式還有一個共同的缺點:即管理員對儲存在網路儲存中的檔案的使用情況無法有一個比較清晰的了解,只能根據檔案的儲存時間來決定是否對其進行空間清理。
本文介紹一種透過HTTP實現的比較簡單的網路儲存方式。這種方式是在WINDOWS平台上透過IIS與ASP/ASP.NET來實現,不僅使用簡單、可上載任意類型的文件,而且可以對用戶使用空間進行限制,一次傳輸小到20字節、大到幾百兆都可以由管理者進行管理,另外,文件的安全性也得到了保障,只有文件擁有者及得到授權者才可回載文件。讀懂本文第二大點中的資料結構及第三大點中的上傳源碼,將幫助你自己做一個網絡存儲,你就不必依賴於市場上提供的免費網絡存儲,使網絡內部的敏感數據文件的安全牢牢掌握在自己手中。
概述與基本功能
安裝一台作為網絡存儲宿主的伺服器,操作系統採用windows平台,配套IIS5.0,設置好WEB服務,在主網站下建立一個虛擬網站,指向網絡存儲,如:d:netspace spacenetmyspace。所有的asp及asp.net原始碼放置在主網站(如:c:inetpubwwwroot)下,d:netspacespacenetmyspace下將放置使用者上傳的檔案(虛擬網站改變,在原始碼中也應作相應調整)。
1、用到的基本資料庫及結構:
⑴ ftpsapce.mdb: 擁有表userlist, 表基本結構:
Id:順序號,自動產生;
Xh:用戶帳號,註冊及驗證產生;
Xm:用戶姓名,註冊及驗證產生;
Kl:用戶口令,註冊及驗證產生;
Maxspace:使用者空間最高限額,註冊取預設值,管理員可透過管理重新設定;
Nowspace:使用者目前佔用空間的數量;
Lastaccessday:用戶最近一次造訪時間,供管理員管理空間時參考;
Fromday:用戶報名時間;
Checkx:使用者驗證已否標誌。
⑵ Filelist.mdb:擁有表files,表基本結構:
Id:順序號,自動產生;
Filename:檔名,上載系統判斷產生;
Fsize:檔案大小數值;
Xh:用戶帳號;
Upday:上載時間;
Filescript:檔案描述,是使用者上載時的檔案的路徑及原始檔案名,供使用者載入時參考;
2、基本功能
⑴ 使用者登入主網站,進入網站主頁面,給予使用者基本資料進行使用者註冊。
⑵ 管理員依據使用者註冊資料審核,設定使用者最大使用空間。
⑶ 審核通過的使用者上傳檔案到網路儲存。系統判定使用者合法性及文件合法性,在資料庫中登記使用者上傳的文件及使用者資料。
⑷ 審核過的使用者透過下載功能對自己上傳的檔案進行回載或刪除。
⑸ 管理員根據使用者資料庫及文件資料庫對網路空間進行管理。
⑹ 擴充的系統允許授權的使用者對授權使用者的上傳檔案進行下載。
上載模組基本源碼
限於篇幅,本文僅給出上載模組的基本源碼,需要更多源碼可透過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="檢驗正常"
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指帳號,kl1指口令
dim objconnstr as string="provider=microsoft.jet.oledb.4.0;data source="
& server.mappath("ftpspace.mdb")
*** 以上兩行在原始碼中應為同一語句
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
*** 以上判定帳號與口令是否合法
if ix<=0 then
errors.text="帳號口錯誤!或使用者尚未通過認證,請等待管理員認證!"
else
if fileup.postedfile.contentlength>maxs-nows then
if fileup.postedfile.contentlength>=maxs then
errors.text="檔案長度大於賦予空間大小,不能上傳!"
else
errors.text="可用空間不足,請刪除舊檔案!"
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)
*** 以上為使用者上傳檔案取一個唯一的主檔案名稱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"
*** 給予使用者上傳檔案的絕對路徑及完整檔案名稱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)&"位元組."
nowspace.text=cstr(nows+fileup.postedfile.contentlength)&"位元組."
*** 以上作上傳動作,併計算使用者的已用總空間及剩餘總空間end if
end if
end sub
</script>
<body>
<form enctype="multipart/form-data" runat="server">
<table>
<tr><td>帳號:</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>
位元組大小:<asp:label id="fsize" runat="server"/><br>
檔案類型:<asp:label id="ftype" runat="server"/><br>
使用者帳號:<asp:label id="username" runat="server"/><br>
剩餘空間:<asp:label id="respace" runat="server"/><br>
已用空間:<asp:label id="nowspace" runat="server"/><br>
上傳狀態:<asp:label id="errors" runat="server"/>
</div>
*** 以上在瀏覽器中告訴使用者檔案上傳前後的相關訊息
</body>
</html>
結論
本文所述的方法基於無元件技術,在文件的安全性及個人隱私方面考慮的比較多,最適合在windows server 2003配合IIS6.0平台上使用,方法簡單安全,稍加擴展,如在userlist中新增使用者號、群組號,在files中新增群組號,即可對檔案的權限進行設定,可方便實現檔案的網路提交、驗證、共用。配合磁碟陣列,則在資料安全方面將有質的提升。