ASP.NET实现网络空间管理
⑴ 电子阅览室、计算机房、网吧等公共上机场所由于使用频繁、维护滞后等原因,输出系统如软驱等设备受损的现象普遍,往往在你需要将加工后的数据输出时才发现输出设备不能工作而大为光火,并且许多计算机房为了节省成本,在联网的计算机上并不配全必要的输出设备。
⑵ 电脑普及的同时使的人们对它的依赖越来越强,很多办公事务已经离不开电脑。换句话说,办公人员的电脑里开始存放着许多重要的办公与私人数据。而这些数据,在大多数情况下是唯一的,意即它们的拥有者并没有把它们做一份副本存放在不同的电脑上,其安全性完全取决于它们的拥有者的电脑的稳定性。
⑶ Internet的普及拉近了人们之间的距离,让人们交流变得更为便捷,但是我们每天需要在家庭、办公室、网吧等不同场所上网,怎样才能持续对某份文档进行编辑处理呢?或许通过优盘或者是移动硬盘之类的移动存储设备能够随身携带这些资料,不过随身多带一个这样的设备特别是移动硬盘总归不是很方便,而且不同的场所、不同的设备、不同的操作系统对优盘或移动硬盘的支持不尽相同,使用者的电脑水平也不尽相同。
……
由于这些事实,使的网络存储作为一种需要登上了舞台。
目前实现网络存储的方式有很多种,比如电子邮件、FTP、网上邻居、HTTP等等。其中,FTP功能最为强大,但使用起来却稍显复杂,一大堆设置足以让许多人望而止步,尤其用户数量不可预见时,针对特殊需求用户的设置将更加繁琐;电子邮件是大家所熟悉的了,但在局域网内部,财务、劳资等文件资料需通过这种方式交流不是好办法,而且,当你的文件足够大时对邮件空间是个致命冲击;网上邻居通过在本机上指定共享的Web文件夹并放置文件,一定范围内的用户可以访问到这些文件,然而这种方式使用的范围相当有限,通常在同一个DNS段地址内的用户才能顺利访问,其它尤其是Internet上的用户,很难使用,此外同电子邮件类似,它的使用也不直观,很多时候你不得不在许多列表计算机上一层层展开搜索才有可能获取你想要的资源! 以上所述这些网络存储方式还有一个共同的缺点:即管理员对存储在网络存储中的文件的使用情况无法有一个比较清晰的了解,只能根据文件的存储时间来决定是否对其进行空间清理。
本文介绍一种通过HTTP实现的比较简单的网络存储方式。这种方式是在WINDOWS平台上通过IIS与ASP/ASP.NET来实现,不仅使用简单、可上载任意类型的文件,而且可以对使用者使用空间进行限制,一次传输小到20字节、大到几百兆都可以由管理者进行管理,另外,文件的安全性也得到了保障,只有文件拥有者及得到授权者才可回载文件。读懂本文第二大点中的数据结构及第三大点中的上传源码,将帮助你自己做一个网络存储,你就不必依赖于市场上提供的免费网络存储,使网络内部的敏感数据文件的安全牢牢掌握在自己手中。
概述与基本功能
安装一台作为网络存储宿主的服务器,操作系统采用windows平台,配套IIS5.0,设置好WEB服务,在主网站下建立一个虚拟网站,指向网络存储,如:d:/netspace/spacenet/myspace。所有的asp及asp.net源码放置在主网站(如:c:/inetpub/wwwroot)下,d:/netspace/spacenet/myspace下将放置用户上传的文件(虚拟网站改变,在源码中也应作相应调整)。
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里添加组号,即可对文件的权限进行设定,可方便实现文件的网络提交、验证、共享。配合磁盘阵列,则在数据安全方面将有质的提升。