网络硬盘开发技巧之ASP.NET+XML
文件传送常用的三种方式FTP、Email及“网上邻居”都在一定程度上实现了文件数据的交流,但它们都主要面向“点对点”的传送,无法实现“一块空间,资源互见”的应用需求,这种基于“点对多”的共享模式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。常用传输方式及其在特定环境下面临的困难我们经常有这样的应用需求:通过网络交换公共数据文件以实现资源共享,同时保护私有数据不被非法访问,并使用简单、直观的方式操作。
英国Ewedrive提供1GB的免费存储空间,比较好的是它不限制单个文件大小。
我们常用的文件传输FTP、Email邮件、网上邻居都能实现文件的传送。其中,"Ftp"功能最为强大,但使用起来却稍显复杂,一大堆设置足以让许多人望而止步,尤其用户数量不可预见时,针对特殊需求用户的设置将更加繁琐;"Email"是大家所熟悉的了,但它的传送不仅需要你连入Internet,而且它的安全性也是个问题,在企业内部,财务、劳资等文件资料需通过这种方式交流不是好办法;"网上邻居"是又一种传送文件的方法,通过在本机上指定共享的Web文件夹并放置资源文件,一定范围内的用户可以访问到这些文件,然而这种方式使用的范围相当有限,通常在同一个DNS段地址内的用户才能顺利访问,其它尤其是Internet上的用户,很难使用,此外同Email类似,它的使用也不直观,很多时候你不得不在许多列表计算机上一层层展开搜索才有可能获取你想要的资源!由此看来,以上三种方式虽然在一定程度上实现了文件数据的交流,但它们都主要面向"点对点"的传送(你只能被动地等对方放置数据而不能主动"可视化"地索取),无法实现"一块空间,资源互见"的应用需求,这种基于"点对多"的共享方式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。
onedump
OneDump存储空间还是无限制大小的,不过单个文件只有最大5MB,且同时传出10个文件,可用于存储一些文档之类的东西。
网络硬盘的优势网络硬盘(也称共享空间),是服务器上的一块硬盘空间,在这里,如果你具备足够的权限,你可以对它随意操作,就象使用你的本地计算机一样。要知道,这一切以Http的方式传输,以Web的形式展现在所有用户面前,通过浏览器这种熟悉的方式访问,这样,"一块空间,资源互见"的共享模式得以实现!此外,网络硬盘界面在客户端运行,它允许用户提交数据到服务器,然后在指定的范围内管理这些信息,这种处理模式大量使用在实际开发中,尤其是在构建交互式网络文档管理系统方面:网上考试系统、文件传输系统、新闻发布系统以及公司竞标系统等方面都有大量应用!以下使用asp.net(VisualC#语言实现)和Xml(可扩展标记语言)开发了这样的网络硬盘系统。关于程序的开发细节及代码中使用的关键技术和难点,都有详细的讲解,参照这些说明,你完全可以开发出自己的网络硬盘。
网络硬盘开发:网络硬盘实现的功能
我们的网络硬盘实现了以下功能:
1、查看文件夹内容
2、创建新文件夹同时可设置访问权限
3、文件夹间的跳转:进入下一级,返回上一级
4、上传文件到指定文件夹
5、下载文件到本机或在线查看文件内容
6、删除文件或文件夹
网络硬盘开发细节及技术关键点
1、查看文件夹内容
程序一开始将进入指定的根文件夹(如\NetHard),这个文件夹下的内容将通过数据绑定控件(DataGrid)来列表显示,包括以下方面:类别(区别文件夹或文件)、名称、权限(是否允许进入文件夹?是否可以下载文件?)、删除(是否允许删除文件或文件夹?)以及针对文件夹的创建者。这里,由于文件夹中内容动态变化(你不知道什么时候就有用户传送了文件或新建了文件夹或删除了它们),我们通过动态创建数据表DataTable来读取指定文件夹下的内容,然后作为数据源与显示控件DataGrid绑定,这样,数据的显示就总是适时的。创建动态表的函数如下:
publicDataTableBind(stringfullFolderPath) //创建数据表读取文件夹内容 { //以下是动态创建数据表的方法DataTabledt=newDataTable();DataRowdr; //首先创建数据表结构dt.Columns.Add(newDataColumn("type",System.Type.GetType("System.String"))); //类型dt.Columns.Add(newDataColumn("name",System.Type.GetType("System.String"))); //名称dt.Columns.Add(newDataColumn("action",System.Type.GetType("System.String"))); //操作dt.Columns.Add(newDataColumn("owner",System.Type.GetType("System.String"))); //创建人//为每一行填充数据foreach(stringdinDirectory.GetFileSystemEntries(fullFolderPath)) { dr=dt.NewRow();//建新行string[]parts=d.Split(newchar[]{'\\'}); stringtxt=parts[parts.Length-1]; //取最后一部分的字符串,它将可能是文件名或文件夹dr[1]=txt; //名称nameif(File.Exists(d)) //如果是文件 { dr[0]="文件"; //类型typeintpos=currFullPath.IndexOf("NetHard"); stringrelaUrl=currFullPath.Substring(pos); stringurl="http://10.80.50.1/SharedSpace/"+relaUrl+"/"+txt; //10.80.50.1为作者服务器地址,你应该将它修改为你所在服务器地址dr[2]="下载"; } elseif(Directory.Exists(d)) { //如果是文件夹dr[0]="文件夹"; //type类型stringpassword=GetFolderPassword(d); //取得文件夹密码信息inttype=GetFolderLimitType(d); if((password!="no")&&(type!=1)) dr[2]="href=PasswordValidate.aspx?path="+d+">密封"; //操作actionelsedr[2]="进入"; //操作actiondr[3]=GetFolderOwner(d);//取文件夹创建者名 } elseResponse.Write("");dt.Rows.Add(dr); //添加行returndt; //返回数据表 }
2、创建文件夹及设置访问权限
在当前路径下输入新文件夹名称来创建新文件夹,通过调用.net的IO名字空间中的类库Directory方法来实现该操作:Directory.CreateDirectory(stringdirectory),字符串directory表示新建文件夹的完整路径,该方法默认向所有用户开放新文件夹的完全读写访问权限。对于网络硬盘共享根文件夹可手动进行创建,并设置写入权限,通过执行"internet信息服务"的"权限向导"来设置访问权限,可以设置密码来指定是否允许用户进入该文件夹以及是否允许用户删除该文件夹。此外,为了管理这些文件夹,需要保留相关设置信息:如文件夹名、位置、受限操作类型、密码及创建者等。将这些信息写入XML文件,随后通过读写该XML文件来实现对文件夹的相关操作。
PublicvoidCreateXmlOrAddFrag (stringxmlFullPath,stringfolderFullPath,stringowner,stringpassword,inttype) { XmlDocumentxmlDoc=newXmlDocument(); stringxml=""; StringxmlNode="<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="<?xmlversion=’1.0’encoding=’gb2312’?>"; xml+="<folder>"; xml+=xmlNode; xml+="</folder>"; xmlDoc.LoadXml(xml); xmlDoc.Save(xmlFullPath);//存储文件 } else { //存在xml存储文件则添加新的文档片段xmlDoc.Load(xmlFullPath); XmlDocumentFragmentdocFrag=xmlDoc.CreateDocumentFragment(); //文档片元素节点 docFrag.InnerXml=xmlNode; XmlNodecurrNode=xmlDoc.DocumentElement; //获取文档根节点currNode.InsertBefore(docFrag,currNode.FirstChild); //插入文档片段xmlDoc.Save(xmlFullPath);//存储改变内容 } }
其中,参数fileFullPath是存储文件夹信息的XML文件路径,folderFullPath是此新文件夹路径,owner是创建者名,password是密码,type表示限制操作的类型("0"表示进入受限,"1"表示删除受限)。程序首先判断存储文件夹信息的文件是否存在,不存在则动态创建文件,之后新建文件夹时,只需添加文档片段即可。这里,对XML文件的读写通过文档对象模型DOM实现,由于此处XML文件不会很大,因此对内存资源要求不会太高,速度会很快。
3、对文件及文件夹的操作
对文件的操作包括"下载"和"删除"两种,用下面的语句实现下载功能:
dr[2]="<ahref="+url+"target=_blank"+">下载</a>";//建立联接地址其中,url是指定文件对应的服务器路径。通过这样的链接将文件定位到服务器上的对应位置,客户端可以下载文件到本机上,也可在服务器上打开它。
删除文件则利用.NET的IO命名空间的File类库中的方法实现:File.Delete(stringfilename);其中,filename为文件的完整路径。
如果文件夹在创建时被设置为"进入受限"或者"删除受限",用户在执行这样的操作时将被要求密码验证,只有通过验证才能完成相应的操作。.NET的Directory类库提供的方法Delete()只能删除空文件夹,因此需要先清空文件夹中的内容,然后才能完成此操作。由于文件夹中可能还包含有文件夹,这里通过递归调用实现该操作:
PublicvoidDeleteFolder(stringdir) { Foreach(stringdinDirectory.GetFileSystemEntries(dir)) { If(File.Exists(d))File.Delete(d); //直接删除其中的文件ElseDeleteFolder(d); //递归删除子文件夹 } Directory.Delete(dir);//删除已空文件夹 }
其中,参数dir是待删除文件夹的完整路径。程序使用循环语句,查找文件夹中的内容,若是文件则直接删除,若是文件夹,则递归调用方法自身来删除子文件夹,文件夹清空后再完成删除操作。
4、文件上传
.NET提供的类库HttpPostedFile和HttpFilesCollection可以访问上传到服务器的文件,并且可以控制文件上传过程。HttpPostedFile类封装已上传到服务器的文件对象,其方法和属性提供对每个文件内容和属性的访问;HttpFilesCollection类为多个HttpPostedFile对象提供一个容器,保存上传给服务器的数据结构的类,利用被传送的文件集合的Files属性从HttpRequest对象加以访问。
1)客户端表单的编码类型Enctype设置为multipart/form-data的MIME格式,提交表单使用HTTP的post方法:
<Formid="form1"method="post"enctype="multipart/form-data/form-data"runat="server">
2)HttpInputFile控件运行在服务器端,设置方法如下:
<INPUTid="fileUp"type="file"size="6"runat="server">
3)如果要上传多个文件,可设置多个HttpInputFile控件,然后利用HttpRequest.Files来分别获取这些文件。
5、跟踪"当前路径"值
由于需要在不同的文件夹之间跳转,而所有文件夹的内容都通过同一个页面Default.ASPx来显示,当传送查询字符串调用它时,可以设置一个静态变量实现路径的完整表示:publicstaticstringcurrFullPath=""。当前路径发生改变时,将路径值传送给这个静态变量,该变量始终存储当前路径值,用它作为查询字符串调用显示页:currFullPath=Request["path"]。因此,利用Response.Redirect("Default.aspx?path="+currFullPath)语句总能显示当前文件夹下的内容。
6、环境配置文件Web.config的处理
在中文状态下,需要将全球化设置编码由默认的"Utf-8"改为"gb2312":
<GlobalizationRequestEncoding="gb2312"ResponseEncoding="gb2312"/>
同时,考虑到Web.config默认设置的文件大小可能不能满足实际需要,通过修改参数maxRequestLength的值,可将其尺度适当放大一些:
<HttpRuntimemaxRequestLength="500000"></httpRuntime>
结束语
asp.net技术与XML技术是当前网络开发应用的热点,在数据传输、信息发布、电子支付及网络安全等诸多领域被广泛应用。这里将相关技术结合起来用于网络硬盘开发,实现系统资源共享,不仅可以满足用户的基本需求、操作简便,而且可有效保护用户私有数据不被非法访问,具有一定安全性,便于维护,因此在文件传输系统、网上考试系统以及新闻发布系统等实际应用中,均可广泛采用这种处理模式。