ASP.NET XML打造网络硬盘
|
文件传送常用的三种方式:FTP、Email及“网上邻居”,都在一定程度上实现了文件数据的交流,但它们都主要面向“点对点”的传送,无法实现“一块空间,资源互见”的应用需求,这种基于“点对多”的共享模式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。 由此看来,以上三种方式虽然在一定程度上实现了文件数据的交流,但它们都主要面向"点对点"的传送(你只能被动地等对方放置数据而不能主动"可视化"地索取),无法实现"一块空间,资源互见"的应用需求,这种基于"点对多"的共享方式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。 网络硬盘的优势 网络硬盘(也称共享空间),是服务器上的一块硬盘空间,在这里,如果你具备足够的权限,你可以对它随意操作,就象使用你的本地计算机一样。要知道,这一切以Http的方式传输,以Web的形式展现在所有用户面前,通过浏览器这种熟悉的方式访问,这样,"一块空间,资源互见"的共享模式得以实现! 此外,网络硬盘界面在客户端运行,它允许用户提交数据到服务器,然后在指定的范围内管理这些信息,这种处理模式大量使用在实际开发中,尤其是在构建交互式网络文档管理系统方面:网上考试系统、文件传输系统、新闻发布系统以及公司竞标系统等方面都有大量应用! 以下使用Asp.net(Visual C#语言实现)和Xml(可扩展标记语言)开发了这样的网络硬盘系统。关于程序的开发细节及代码中使用的关键技术和难点,都有详细的讲解,参照这些说明,你完全可以开发出自己的网络硬盘。 网络硬盘实现的功能 我们的网络硬盘实现了以下功能: 1、查看文件夹内容 2、创建新文件夹同时可设置访问权限 3、文件夹间的跳转:进入下一级,返回上一级 4、上传文件到指定文件夹 5、下载文件到本机或在线查看文件内容 6、删除文件或文件夹
软件开发网 www.mscto.com [1] [2]
开发细节及技术关键点 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.aspx?path=" d ">密封</a>";//操作action else dr[2]="<a href=Default.aspx?path=" d ">进入</a>";//操作action dr=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文件不会太大,这种方式不会对内存资源要求太高,速度也会很快!
[1] [2]
3、对文件及文件夹的操作: 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.aspx?path=" currFullPath)就总能显示当前文件夹下的内容了! 参考资料: 《Asp.net程序员参考手册》、《XML高级编程》、《C#高级编程》、微软MSDN 运行环境: 程序在:Windows XP中文正式版、.Net Frameworks 正式版、Visual Studio.Net中文正式版下调试通过,在局域网(总部 多个异地子公司模式)上稳定运行 [1] [2]
源代码网推荐 源代码网供稿. |
