20编程21编程爱好者22vb编程,23数控编程24编程中国25编程论坛26编程语言27游戏编程28编程软件下载29编程工具30socket编程31网络编程32编程器33c语言编程,34flash编程35编程软件36数控车床编程37windows编程38编程入门,39windows核心编程40cnc编程41vc 编程,42linux 编程43asp编程44vb编程实例45串口编程46手机编程47编程教程48plc编程,49单片机编程50vc 网络编程51excel编程,52unix网络编程53编程学习,54编程之道55数据库编程56单片机编程器57黑客编程58计算机编程59网页编程60嵌入式编程,61编程高手箴言62flash编程教程63vfp编程64windows网络编程,65编程基础66c语言编程实例67c语言编程软件68vf编程69shell编程,70vb数据库编程71matlab编程,72c语言编程工具73编程思想74php编程,75c编程76jsp编程77电脑编程技巧与维护,78三菱plc编程软件,79vb编程软件下载80pb编程81数控编程实例82asp编程工具,83c专家编程,84win32编程85数控铣床编程86asp.net高级编程,,87vc 数据库编程88vba编程89jsp高级编程90c语言编程宝典,91unix环境高级编程;92编程珠玑93delphi编程94delphi数据库编程95vb编程教程96单片机编程软件
1编程爱好者网站2vb编程网站,3电子商务网站编程4游戏编程网站5最大的编程网站6网站编程软件7可编程逻辑中文网站8网站 编程 语言9网站编程 数据库,10jsp网站编程11asp编程网站12网站编程电子书13好的编程网站,14c语言编程网站15编程门户网站16如何学习网站编程17百度网站的编程语言18vb编程乐园网站指南19wince 编程网站
1asp.net2asp教程,3asp源码4asp免费空间5asp论坛6asp代码7asp源代码8asp下载,9asp源码下载10asp木马11asp.net教程12asp学习13什么是asp14asp空间,15admin.asp dir16asp程序17asp教程下载18asp.net 2.019asp整站程序,20asp文件21十天学会asp22asp入门23asp源程序24asp实例25asp函数26asp服务器27asp.net论坛28asp id,29asp整站下载30asp网站31asp论坛下载32asp源代码下载,33asp整站34asp技术35asp access36asp.net源码37asp简介38asp免费空间申请39asp.net下载,40asp留言板41asp sql42asp 数据库43asp站长助手44asp连接数据库45asp留言本,46asp.net教程下载47asp分页48asp格式49asp论坛程序50asp.net源代码51asp软件52asp模板53asp session54asp语法,55如何打开asp文件56asp解密57asp编程58asp.net实例,59asp实例教程60asp程序下载61asp计数器62asp.net入门,63asp运行环境64asp基础教程65apache asp66asp入门教程,67asp编辑器68asp组件69asp连接access70conn.asp71asp书籍,72asp论文73asp工具74asp文件上传75asp探针76asp原代码下载77asp include78user wantpws.asp79asp split,80asp fso81asp网页制作82printpage.asp83什么是asp.net,84index.asp85asp.net datagrid86asp基础87asp replace88asp代码下载89asp新闻系统
1php论坛2免费php空间,3php下载4php源码5php mysql6php教程7php文件8php空间9apache php10什么是php11apache php mysql12php学习13php论坛下载14iis php15php cms16php入门17php blog18php手册,19php代码20php整站程序21php session22php安装23php源码下载24php配置25php源代码26php cookie27php网站28iis php mysql29php编程30php留言板31php探针32php注入33php.ini34php运行环境35index.php36php教程下载,37php论坛程序38php 文件上传39php服务器40php环境41php 函数;42php格式43php编辑器44php editor45如何打开php文件46php access47十天学会php48php模板49php xml;50php程序51php留言本52php文件怎么打开53php技术54ajax php55php简介56php注入工具57打开php文件58php语言59php mail;60php软件;61免费php mysql空间62php self63php 数组.64php分页,65php nuke66php阅读器67免费php空间申请68国外免费php空间69php程序下载70php 正则表达式71asp php,72php网站管理系统73php程序设计74php是什么文件75php 实例76php 开发工具77php 验证码78php官方网站79php学习资料
1jsp教程2jsp源码3jsp论坛4什么是jsp5jsp源代码6jsp空间7jsp学习8jsp文件9jsp mysql,10jsp入门11jsp连接数据库12jsp技术13eclipse jsp14jsp分页15jsp源代码下载16jsp access17jsp教程下载18jsp开发工具,19jsp代码20jsp简介21jsp环境配置22jsp连接mysql,23jsp实例24免费jsp空间25jsp配置26jsp session,27jsp运行环境28jsp下载29jsp网站30jsp include31jsp编程,32jsp介绍33jsp 数据库34jsp设计35jsp servlet36jsp标签37jsp应用开发详解38jsp 中文39jsp oracle40jsp论文41jsp 文件上传,42jsp高级编程43jsp源码下载44jsp 乱码45jsp开发46jsp分页显示47jsp sql48jsp连接sql49jsp 页面跳转50jsp request51eclipse开发jsp52iis jsp53jsp开发环境54jsp sqlserver,55jsp cookie56jsp服务器57jsp连接access58jsp毕业论文59jsp新闻发布系统60jsp留言板61jsp 电子书62jsp forward63jsp中文网64tomcat jsp65jsp语法66jsp留言本67asp jsp,68jsp import69jsp源程序70jsp基础71jsp毕业设计,72jsp格式73jsp 中文乱码,74jsp开发实例75jsp书籍76jsp论坛下载77jsp 上传,78jsp计数器79jsp 注释80jsp电子教程81jsp 保存用户名密码,82jsp的优点83jsp软件下载84jsp语言85jsp代码下载86jsp blog87jsp 打印88jsp手册

思顿科技-专业网站制作指南、网页设计制作教程、免费网页制作素材下载、免费学习网页制作指南,专业网站建设服务、网站制做指南、免费网页制作指南、网页制作服务、免费空间域名服务、
首页
网页教程
网页素材
收录查询
工具下载
网站欣赏
网站论坛
免费博客
建站服务

ASP.NET+XML开发网络硬盘
你当前的位置:网站制作指南 --> 技术文档全集 (www.STasp.com)

文件传送常用的三种方式FTP、EMAIL及“网上邻居”都在一定程度上实现了文件数据的交流,但它们都主要面向“点对点”的传送,无法实现“一块空间,资源互见”的应用需求,这种基于“点对多”的共享模式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。

常用传输方式及其在特定环境下面临的困难

我们经常有这样的应用需求:通过网络交换公共数据文件以实现资源共享,同时保护私有数据不被非法访问,并使用简单、直观的方式操作。我们常用的文件传输FTP、EMAIL邮件、网上邻居都能实现文件的传送。其中,"FTP"功能最为强大,但使用起来却稍显复杂,一大堆设置足以让许多人望而止步,尤其用户数量不可预见时,针对特殊需求用户的设置将更加繁琐;"EMAIL"是大家所熟悉的了,但它的传送不仅需要你连入INTERNET,而且它的安全性也是个问题,在企业内部,财务、劳资等文件资料需通过这种方式交流不是好办法;"网上邻居"是又一种传送文件的方法,通过在本机上指定共享的WEB文件夹并放置资源文件,一定范围内的用户可以访问到这些文件,然而这种方式使用的范围相当有限,通常在同一个DNS段地址内的用户才能顺利访问,其它尤其是INTERNET上的用户,很难使用,此外同EMAIL类似,它的使用也不直观,很多时候你不得不在许多列表计算机上一层层展开搜索才有可能获取你想要的资源!

由此看来,以上三种方式虽然在一定程度上实现了文件数据的交流,但它们都主要面向"点对点"的传送(你只能被动地等对方放置数据而不能主动"可视化"地索取),无法实现"一块空间,资源互见"的应用需求,这种基于"点对多"的共享方式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。

网络硬盘的优势

网络硬盘(也称共享空间),是服务器上的一块硬盘空间,在这里,如果你具备足够的权限,你可以对它随意操作,就象使用你的本地计算机一样。要知道,这一切以HTTP的方式传输,以WEB的形式展现在所有用户面前,通过浏览器这种熟悉的方式访问,这样,"一块空间,资源互见"的共享模式得以实现!

此外,网络硬盘界面在客户端运行,它允许用户提交数据到服务器,然后在指定的范围内管理这些信息,这种处理模式大量使用在实际开发中,尤其是在构建交互式网络文档管理系统方面:网上考试系统、文件传输系统、新闻发布系统以及公司竞标系统等方面都有大量应用!

以下使用ASP.NET(VISUAL C#语言实现)和XML(可扩展标记语言)开发了这样的网络硬盘系统。关于程序的开发细节及代码中使用的关键技术和难点,都有详细的讲解,参照这些说明,你完全可以开发出自己的网络硬盘。


网络硬盘实现的功能


我们的网络硬盘实现了以下功能:

1、查看文件夹内容

2、创建新文件夹同时可设置访问权限

3、文件夹间的跳转:进入下一级,返回上一级

4、上传文件到指定文件夹

5、下载文件到本机或在线查看文件内容

6、删除文件或文件夹


开发细节及技术关键点


1、查看文件夹内容:

程序一开始将进入指定的根文件夹(如NETHARD),这个文件夹下的内容将通过数据绑定控件(DATAGRID)来列表显示,包括以下方面:类别(区别文件夹或文件)、名称、权限(是否允许进入文件夹?是否可以下载文件?)、删除(是否允许删除文件或文件夹?)以及针对文件夹的创建者。这里,由于文件夹中内容动态变化(你不知道什么时候就有用户传送了文件或新建了文件夹或删除了它们),我们通过动态创建数据表DATATABLE来读取指定文件夹下的内容, 然后作为数据源与显示控件DATAGRID绑定,这样,数据的显示就总是适时的。创建动态表的函数如下:

PUBLIC DATATABLE BIND(STRING FULLFOLDERPATH)//创建数据表读取文件夹内容
{
//以下是动态创建数据表的方法
DATATABLE DT=NEW DATATABLE();
DATAROW DR;
//首先创建数据表结构
DT.COLUMNS.ADD(NEW DATACOLUMN("TYPE",SYSTEM.TYPE.GETTYPE("SYSTEM.STRING")));//类型
DT.COLUMNS.ADD(NEW DATACOLUMN("NAME",SYSTEM.TYPE.GETTYPE("SYSTEM.STRING")));//名称
DT.COLUMNS.ADD(NEW DATACOLUMN("ACTION",SYSTEM.TYPE.GETTYPE("SYSTEM.STRING")));//操作
DT.COLUMNS.ADD(NEW DATACOLUMN("OWNER",SYSTEM.TYPE.GETTYPE("SYSTEM.STRING")));//创建人
//为每一行填充数据
FOREACH(STRING D IN DIRECTORY.GETFILESYSTEMENTRIES(FULLFOLDERPATH)){
DR=DT.NEWROW();//建新行
STRING[] PARTS=D.SPLIT(NEW CHAR[]{'\'});
STRING TXT=PARTS[PARTS.LENGTH-1];//取最后一部分的字符串,它将可能是文件名或文件夹
DR[1]=TXT;//名称NAME
IF(FILE.EXISTS(D))//如果是文件
{
DR[0]="文件";//类型TYPE
INT POS=CURRFULLPATH.INDEXOF("NETHARD");
STRING RELAURL=CURRFULLPATH.SUBSTRING(POS);
STRING
URL="HTTP://10.80.50.1/SHAREDSPACE/"+RELAURL+"/"+TXT;//
10.80.50.1为作者服务器地址,你应该将它修改为你所在服务器地址
DR[2]="<A HREF="+URL+" TARGET=_BLANK"+">下载</A>";
}
ELSE IF(DIRECTORY.EXISTS(D)){//如果是文件夹
DR[0]="文件夹";//TYPE类型
STRING PASSWORD=GETFOLDERPASSWORD(D);//取得文件夹密码信息
INT TYPE=GETFOLDERLIMITTYPE(D);
IF((PASSWORD!="NO")&&(TYPE!=1))
DR[2]="<A
HREF=PASSWORDVALIDATE.ASPXPATH="+D+">密封</A>";//操作ACTION
ELSE
DR[2]="<A HREF=DEFAULT.ASPXPATH="+D+">进入</A>";//操作ACTION
DR[3]=GETFOLDEROWNER(D);//取文件夹创建者名
}
ELSE
RESPONSE.WRITE("<SCRIPT>ALERT('无对象可绑定!')</SCRIPT>");
DT.ROWS.ADD(DR);//添加行
RETURN DT;//返回数据表
}
}

这个方法取出指定文件夹下的内容分别处理:如果是文件,就显示"下载"链接指向服务器上文件的URL地址;对文件夹需要视保护与否及保护类型进一步区别处理:若"进入受限"则显示"密封"导入到密码验证页,"进入不受限"时修改查询字符串,显示"进入"链接指向初始显示页。

2、创建新文件夹及设置访问权限:

输入新文件夹名后,你就可以在当前路径下创建新的文件夹,ASP.NET下远程创建新文件夹和在本地机操作完全一样,非常的简单,.NET的IO名字空间提供了专门的类库DIRECTORY,通过调用其方法就可以实现,语句如下:

DIRECTORY.CREATEDIRECTORY(STRING DIRECTORY)

其中,字符串DIRECTORY表示新建文件夹的完整路径,这个方法默认向所有用户开放新文件夹的完全读写访问权限。特殊地,对网络硬盘共享根文件夹(程序中示例为"NETHARD"文件夹,你可以更改它)的创建你还可以手动进行,对应地,你需要手动设置以开放此文件夹的写入权限,在IIS下,你可以在"INTERNET信息服务"下,对该文件夹执行"权限向导"来设置访问权限。

资源共享时应该考虑安全性。这里,你可以设置用户对该文件夹的访问权限,通过设置密码,你可以指定是否允许用户进入该文件夹,是否允许删除该文件夹,或者两者都禁止。这样,你可以保护自己的文件,将它们独占访问或者限制在一个特定的范围内(这个范围的成员应该知道你的密码),这样,产品研发部门可以共用一个文件夹,财务部门也通过同样的方式共用另一个文件夹,不属于这个部门的人员将限制访问。当然,这样的限制你也可以应用到单个文件上(这样的应用似乎不多,程序未实现)。

此外,为了管理这些文件夹,你需要保留它们的设置信息:文件夹名、位置、受限操作类型、密码及创建人等。程序中将这些信息写入一XML文件(此为FOLDER.XML文件),随后对文件夹的各种管理操作均通过读写该XML文件来进行,以下方法就实现了新建文件夹时设置信息的存储:

PUBLIC VOID CREATEXMLORADDFRAG(STRING XMLFULLPATH,STRING
FOLDERFULLPATH,STRING OWNER,STRING PASSWORD,INT TYPE){
XMLDOCUMENT XMLDOC=NEW XMLDOCUMENT();
STRING XML="";
STRING XMLNODE="<CHARACTER>";
XMLNODE+="<FULLPATH>";
XMLNODE+=FOLDERFULLPATH;
XMLNODE+="</FULLPATH>";
XMLNODE+="<OWNER>";
XMLNODE+=OWNER;
XMLNODE+="</OWNER>";
XMLNODE+="<PASSWORD>";
XMLNODE+=PASSWORD;
XMLNODE+="</PASSWORD>";
XMLNODE+="<TYPE>";
XMLNODE+=TYPE;
XMLNODE+="</TYPE>";
XMLNODE+="</CHARACTER>";
IF(!FILE.EXISTS(XMLFULLPATH)){//不存在则创建XML存储文件
XML="<XML VERSION='1.0' ENCODING='GB2312'>";
XML+="<FOLDER>";
XML+=XMLNODE;
XML+="</FOLDER>";
XMLDOC.LOADXML(XML);
XMLDOC.SAVE(XMLFULLPATH);//存储文件
}
ELSE{//存在XML存储文件则添加新的文档片段
XMLDOC.LOAD(XMLFULLPATH);
XMLDOCUMENTFRAGMENT
DOCFRAG=XMLDOC.CREATEDOCUMENTFRAGMENT();//文档片元素节点
DOCFRAG.INNERXML=XMLNODE;
XMLNODE CURRNODE=XMLDOC.DOCUMENTELEMENT;//获取文档根节淀
CURRNODE.INSERTBEFORE(DOCFRAG,CURRNODE.FIRSTCHILD);//插入文档段
XMLDOC.SAVE(XMLFULLPATH);//存储改变
}
}

其中,参数FILEFULLPATH是存储文件夹信息的XML文件路径,FOLDERFULLPATH是此新文件夹路径,OWNER是创建人名,PASSWORD是密码,TYPE表示限制操作的类型("0"表示进入受限,"1"表示删除受限)。在程序运行之初,存储文件夹信息的FOLDER.XML文件可能尚不存在,所以程序中首先判断这个文件是否存在,不存在则动态创建这个文件,这之后新建文件夹时,将只需要添加文档片段。这里,对XML文件的读写通过DOM(文档对象模型)来实现,由于此处XML文件不会太大,这种方式不会对内存资源要求太高,速度也会很快!

3、对文件及文件夹的操作:

对文件的操作包括"下载"和"删除"两种,在上面列表显示指定文件夹中内容时,针对文件,有这样的语句:

DR[2]="<A HREF="+URL+" TARGET=_BLANK"+">下载</A>";//建立联接地址


其中,URL是指定文件对应的服务器路径。 通过这样的链接将文件定位到服务器上的对应位置。视文件格式的不同,客户端可以下载文件到本机上,也可以就在服务器上打开它。

删除文件很简单,.NET的IO命名空间的FILE类库有这样的方法:

FILE.DELETE(STRING FILENAME);其中,FILENAME为文件的完整路径

你需要注意的是,文件的删除将不需要验证,要防止文件被删除,你需要依照下面的方式来进行。(当然,程序中为避免文件误删除提供了确认验证,文件夹删除也一样!)

对文件夹的操作分为:进入或者删除。如果文件夹在创建时被设置"进入受限"或者"删除受限",用户在执行这样的操作时将被要求密码验证,只有通过验证才能完成相应的操作,这种方式保护了你的文件被非法访问或删除。

相对文件的删除,文件夹的删除程序要稍微复杂些,.NET的DIRECTORY类库提供的方法DELETE()只能删除空文件夹,这就需要我们首先清空文件夹中内容,然后才能完成这一操作,由于文件夹中还可能再包含有文件夹,我们通过递归调用来实现这一操作:

//删除文件夹的方法
PUBLIC VOID DELETEFOLDER(STRING DIR)
{
FOREACH(STRING D IN DIRECTORY.GETFILESYSTEMENTRIES(DIR))
{
IF(FILE.EXISTS(D))
FILE.DELETE(D);//直接删除其中的文件
ELSE
DELETEFOLDER(D);//递归删除子文件夹
}
DIRECTORY.DELETE(DIR);//删除已空文件夹
}

 

其中,参数DIR是待删除文件夹的完整路径。程序使用循环语句,查找文件夹中的内容,是文件则直接删除,如果是文件夹,则递归调用方法自身来删除子文件夹,文件夹清空后再完成删除操作。

4、文件上传:

要实现网络硬盘的功能,必须要有可供操作的文件,这些文件来自于客户端的上传(当然,服务器端也能提供这些文件,但这不是网络硬盘的重点),过去我们实现文件的上传,在ASP中通常是使用第一些文件上传组件,比如MICROSOFT 的POSTINGACCEPTOR组件,另外还有第三方提供的一些付费组件(不过说真的,这些组件并不好用)。那时候想要自己开发这样的文件上传组件,相当繁琐;而现在,.NET提供的类库HTTPPOSTEDFILE和HTTPFILESCOLLECTION可以很容易地访问上载到服务器的文件,同时使开发人员控制文件上载过程。其中的HTTPPOSTEDFILE类封装已经上传到服务器的文件对象,其方法和属性提供对每个文件的内容和属性的访问;HTTPFILECOLLECTION类则为多个HTTPPOSTEDFILE对象提供一个容器,用作保存上传给服务器的数据结构的类,这样你就可以利用被传送的文件集合,该文件集合可通过其FILES属性从HTTPREQUEST 对象访问,一旦服务器接收了请求的整个内容,该集合就可以访问。这些内置的组件使得ASP.NET中实现文件上传相当容易,甚至只需要几行代码就可以了!关于ASP.NET中实现文件上传的文章很多,这里不做专门的阐述,需要的话你可以参考那些文章,这里,只提示你需要注意以下几点:

1)、客户端表单的编码类型ENCTYPE 设置为MULTIPART/FORM-DATA的MIME格式,提交表单使用HTTP的POST方法,象下面这样:

<FORM ID="FORM1" METHOD="POST" ENCTYPE="MULTIPART/FORM-DATA/FORM-DATA"
RUNAT="SERVER" >

 

2)、HTTPINPUTFILE控件运行在服务器端,设置RUNAT=SERVER,TYPE=FILE ,象下面这样:

<INPUT ID="FILEUP" TYPE="FILE" SIZE="6" RUNAT="SERVER">

 

3)、要上传多个文件,你可以布置多个HTTPINPUTFILE控件,然后使用HTTPREQUEST.FILES来获取这些文件。

5、环境配置文件WEB.CONFIG的处理:

在中文状态下,你可能需要将全球化设置编码由默认的"UTF-8"改为"GB2312",语句如下:

<GLOBALIZATION
REQUESTENCODING="GB2312"
RESPONSEENCODING="GB2312"
/>

同时,WEB.CONFIG默认设置的的文件大小限制可能并不能满足你的需要,你或许需要将限制尺度放大一些。这通过修改参数MAXREQUESTLENGTH的值来实现,如下所示:

<!-- 设置可接受的最大字节数 -->
<HTTPRUNTIME MAXREQUESTLENGTH="500000">
</HTTPRUNTIME>

6、随时跟踪"当前路径"值:

程序中的另一个关键点是关于"当前路径"的,由于你总是需要在不同的文件夹之间跳转:点击"进入"到达下一级文件夹,点击"上一级文件夹"返回前一级文件夹;而所有这些文件夹的内容都通过同一个页面(DEFAULT.ASPX)来显示,这个显示页面被设置为始终显示当前文件夹下内容。在你传送查询字符串来调用它时,你需要在查询字符串中包含当前路径的完整表示,这在程序中通过设置一个静态变量来实现:PUBLIC STATIC STRING CURRFULLPATH=""; 当前路径发生改变时,总是将这个路径值传送给这个静态标量:CURRFULLPATH=REQUEST["PATH"];这就使得这个静态变量始终存储着当前的路径值,以这个静态变量为查询字符串调用显示页: RESPONSE.REDIRECT("DEFAULT.ASPXPATH="+CURRFULLPATH)就总能显示当前文件夹下的内容了!

参考资料:

《ASP.NET程序员参考手册》、《XML高级编程》、《C#高级编程》、微软MSDN

运行环境:

程序在:WINDOWS XP中文正式版、.NET FRAMEWORKS 正式版、VISUAL STUDIO.NET中文正式版下调试通过,在局域网(总部+多个异地子公司模式)上稳定运行

 
| 关于我们 | 联系我们 | 业务合作 | 友情链接 | 网站地图 |
版权所有©思顿科技-专业网站制作指南2004-2006 在线技术支持- QQ:63127313