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)

1@ Page Language="VB" Debug="true" 
1@ import namespace="System.Data" 
1@ import namespace="System.Data.oledb" 
  1<html>
  2<script language="vbscript" runat="server">   
  3sub uploadfile(sender as object, e as eventargs)   
  4if fileup.postedfile.contentlength<20 then   
  5errors.text="这么小的文件也要上传,背背就可以了."   
  6fileinfo.visible=false   
  7exit sub   
  8else   
  9errors.text="检验正常"   
 10fileinfo.visible=true   
 11end if 
 12
 13*** 以上检查上传文件大小   
 14respace.text="0"   
 15nowspace.text="0" 
 16
 17*** respace指剩余空间,nowspace指已用空间 
 18
 19dim xh1 as string =user1.value   
 20dim kl1 as string =pass1.value 
 21
 22*** xh1指帐号,kl1指口令 
 23
 24dim objconnstr as string="provider=microsoft.jet.oledb.4.0;data source="   
 25& server.mappath("ftpspace.mdb") 
 26
 27*** 以上两行在源码中应为同一语句 
 28
 29dim objconn as oledbconnection = new oledbconnection(objconnstr)   
 30dim sql1 as string="select * from userlist where xh='"+xh1+"' and kl='"+kl1+"'"   
 31dim objrscc as oledbcommand= new oledbcommand(sql1,objconn)   
 32objconn.open()   
 33dim objrs as oledbdatareader = objrscc.executereader()   
 34dim ix as integer=0   
 35dim maxs as long   
 36dim nows as long   
 37while ix=0   
 38if objrs.read() then   
 39if objrs.item("xh")=xh1 then   
 40if objrs.item("kl")=kl1 then   
 41if objrs.item("checkx")=1 then   
 42ix=ix+1   
 43maxs=objrs.item("maxspace")   
 44nows=objrs.item("nowspace")   
 45end if   
 46end if   
 47end if   
 48else   
 49ix=-1   
 50end if   
 51end while 
 52
 53*** 以上判定帐号与口令是否合法 
 54
 55if ix<=0 then   
 56errors.text="帐号口令错!或用户尚未通过认证,请等待管理员认证!"   
 57else 
 58
 59if fileup.postedfile.contentlength>maxs-nows then   
 60if fileup.postedfile.contentlength>=maxs then   
 61errors.text="文件长度大于赋予空间大小,不能上传!"   
 62else   
 63errors.text="可用空间不足,请删除旧文件!"   
 64end if 
 65
 66*** 以上判定用户空间的可用性   
 67else   
 68dim obj4str as string="provider=microsoft.jet.oledb.4.0;   
 69data source=" & server.mappath("filelist.mdb") 
 70
 71*** 以上两行在源码中为同一语句   
 72dim obj4 as oledbconnection = new oledbconnection(obj4str)   
 73dim sql10 as string="select * from files"   
 74dim objrc1 as oledbcommand= new oledbcommand(sql10,obj4)   
 75obj4.open()   
 76dim objrsx as oledbdatareader = objrc1.executereader()   
 77dim fn11 as long =0   
 78while objrsx.read()   
 79fn11=objrsx("filename")   
 80end while   
 81dim fn1 as string   
 82fn1=cstr(fn11+1) 
 83
 84*** 以上为用户上传文件起一个唯一的主文件名   
 85dim objc1str as string="provider=microsoft.jet.oledb.4.0;   
 86data source=" & server.mappath("filelist.mdb") 
 87
 88*** 以上两行在源码中为同一语句   
 89dim objc1 as oledbconnection = new oledbconnection(objc1str)   
 90dim sql3 as string="insert into files(filename,fsize, xh,filescript,upday)   
 91values("+cstr(fn1)+","+cstr(fileup.postedfile.contentlength)+",'"   
 92+xh1+"','"+fileup.postedfile.filename+"','"+cstr(now())+"')" 
 93
 94*** 以上三行在源码中为同一语句   
 95objc1.open()   
 96dim objrs1 as oledbcommand=new oledbcommand(sql3,objc1)   
 97dim fn2 as string   
 98fn2="d:/netspace/spacenet/myspace/"&cstr(fn1)&".zip" 
 99
100*** 给出用户上传文件的绝对路径及完整文件名   
101fsize.text=cstr(fileup.postedfile.contentlength)   
102ftype.text=fileup.postedfile.contenttype   
103fname.text=fileup.postedfile.filename   
104username.text=user1.value   
105fileup.postedfile.saveas(fn2)   
106objrs1.ExecuteNonQuery()   
107objrs.close   
108dim sql5 as string="update userlist set nowspace ="+cstr(nows+fileup.postedfile.contentlength)+   
109",lastaccessday='"+cstr(now())+"' where xh='"+xh1+"'" 
110
111*** 以上两行在源码中为同一语句 
112
113dim objrnc as oledbcommand= new oledbcommand(sql5,objconn)   
114objrnc.executenonquery()   
115respace.text=cstr(maxs-nows-fileup.postedfile.contentlength)&"字节."   
116nowspace.text=cstr(nows+fileup.postedfile.contentlength)&"字节." 
117
118*** 以上作上传动作,并计算用户的已用总空间及剩余总空间   
119end if   
120end if   
121end sub   
122</script>
123<body>
124<form enctype="multipart/form-data" runat="server">
125<table>
126<tr><td>帐号:</td><td><input id="user1" runat="server"/></td></tr>
127<tr><td>口令:</td><td><input id="pass1" runat="server" type="password"/></td></tr>
128<tr><td>文件:</td><td><input id="fileup" runat="server" type="file"/></td></tr>
129<tr><td></td><td><asp:button id="upload" onclick="uploadfile" runat="server" text="上传"></asp:button></td></tr>
130</table>
131</form><hr/>
132<div id="fileinfo" runat="server" visible="false">   
133原文件名:<asp:label id="fname" runat="server"></asp:label><br/>   
134字节大小:<asp:label id="fsize" runat="server"></asp:label><br/>   
135文件类型:<asp:label id="ftype" runat="server"></asp:label><br/>   
136用户帐号:<asp:label id="username" runat="server"></asp:label><br/>   
137剩余空间:<asp:label id="respace" runat="server"></asp:label><br/>   
138已用空间:<asp:label id="nowspace" runat="server"></asp:label><br/>   
139上传状态:<asp:label id="errors" runat="server"></asp:label>
140</div>   
141*** 以上在浏览器中告诉用户文件上传前后的相关信息   
142</body>
143</html>

结束语

本文所述的方法基于无组件技术,在文件的安全性及个人隐私方面考虑的比较多,最适合在windows server 2003配合IIS6.0平台上使用,方法简单安全,稍加扩展,如在userlist里添加用户号、组号,在files里添加组号,即可对文件的权限进行设定,可方便实现文件的网络提交、验证、共享。配合磁盘阵列,则在数据安全方面将有质的提升。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus