`

Asp.net+Xml开发网络硬盘

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


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


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

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


网络硬盘的优势


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

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

以下使用Asp.netVisual 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.aspx?path="+d+">
密封</a>";//操作action
else
dr[2]="<a href=Default.aspx?path="+d+">
进入</a>";//操作action
dr[3]=GetFolderOwner(d);//
取文件夹创建者名
}
else
Response.Write("<script>alert('
无对象可绑定!')</script>");
dt.Rows.Add(dr);//
添加行
return dt;//
返回数据表
}
}



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

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

输入新文件夹名后,你就可以在当前路径下创建新的文件夹,Asp.net下远程创建新文件夹和在本地机操作完全一样,非常的简单,.NetIO名字空间提供了专门的类库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是指定文件对应的服务器路径。 通过这样的链接将文件定位到服务器上的对应位置。视文件格式的不同,客户端可以下载文件到本机上,也可以就在服务器上打开它。

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

File.Delete(string filename)
;其中,filename为文件的完整路径

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

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

相对文件的删除,文件夹的删除程序要稍微复杂些,.NetDirectory类库提供的方法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提供的类库HttpPostedFileHttpFilesCollection可以很容易地访问上载到服务器的文件,同时使开发人员控制文件上载过程。其中的HttpPostedFile类封装已经上传到服务器的文件对象,其方法和属性提供对每个文件的内容和属性的访问;HttpFileCollection类则为多个HttpPostedFile对象提供一个容器,用作保存上传给服务器的数据结构的类,这样你就可以利用被传送的文件集合,该文件集合可通过其Files属性从HttpRequest 对象访问,一旦服务器接收了请求的整个内容,该集合就可以访问。这些内置的组件使得Asp.net中实现文件上传相当容易,甚至只需要几行代码就可以了!关于Asp.net中实现文件上传的文章很多,这里不做专门的阐述,需要的话你可以参考那些文章,这里,只提示你需要注意以下几点:

1
)、客户端表单的编码类型Enctype 设置为multipart/form-dataMIME格式,提交表单使用Httppost方法,象下面这样:

<form id="form1" method="post" enctype="multipart/form-data/form-data"
runat="server" >



2
)、HttpInputFile控件运行在服务器端,设置runat=servertype=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中文正式版下调试通过,在局域网(总部+多个异地子公司模式)上稳定运行
分享到:
评论

相关推荐

    php入门留言板 php+access PHP语言基础

    【PHP】php入门留言板 php+access PHP语言基础 【实例简介】php入门留言板 php access php入门留言板 让你轻松学会php 基本语言结构.php连 access数据库的语法以及功能.php access 【核心代码】 文件清单 ├── admin.php ├── detail.php ├── images │ ├── arrow2.gif │ ├── arrow.gif │ ├── bg.gif │ ├── bottom-bg.gif │ ├── column.gif │ ├── dished_x.gif │ ├── favicon.ico │ ├── layout-bodybg.gif │ ├── layout-footer.gif │ ├── layout-top.gif │ ├── li-right.gif │ └── Thumbs.db ├── inc │ ├── config.php │ ├── conn.php │ └── data.mdb ├── index.php ├── sty

    关于C语言的学习代码和C语言的刷题代码.zip

    C语言诞生于美国的贝尔实验室,由丹尼斯·里奇(Dennis MacAlistair Ritchie)以肯尼斯·蓝·汤普森(Kenneth Lane Thompson)设计的B语言为基础发展而来,在它的主体设计完成后,汤普森和里奇用它完全重写了UNIX,且随着UNIX的发展,c语言也得到了不断的完善。为了利于C语言的全面推广,许多专家学者和硬件厂商联合组成了C语言标准委员会,并在之后的1989年,诞生了第一个完备的C标准,简称“C89”,也就是“ANSI C”,截至2020年,最新的C语言标准为2018年6月发布的“C18”。 [5] C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。

    安卓图片上传和文件上传带jsp服务端源码.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    物资管理系统项目源码.rar

    物资管理系统项目源码.rar是一个综合性的软件开发包,旨在为高校学生提供一个完整的框架和参考实现,以便他们能够进行毕业设计或课程设计。这个压缩包包含了多个关键组件,如用户认证、库存管理、订单处理、报表生成等模块,每个模块都配备了详细的文档和代码实例,确保学生可以快速理解并开始构建自己的物资管理系统。该系统采用了现代的软件架构理念,比如MVC模式,使得前后端分离,便于维护和升级。同时,它支持多种数据库系统,如MySQL、SQLite等,提供了数据持久化的灵活性。在安全性方面,系统实现了基于角色的访问控制,保障了操作的权限划分。此外,它还考虑了用户体验,界面友好,操作直观。对于即将步入职场的软件工程专业的学生而言,通过分析和扩展这个源码包中的项目,不仅可以锻炼他们的编程实践能力,还能帮助他们理解企业级应用的开发流程和标准。无论是作为学习资源还是实践平台,物资管理系统项目源码.rar都是一个宝贵的资料,有助于学生将理论知识转化为实际操作技能,为他们日后的职业发展奠定坚实的基础。问问助手:解决方案编制助手重新回答||

    可二次开发程序员表白代码.rar

    “可二次开发程序员表白代码.rar”是一个专为计算机专业的学生和编程爱好者设计的源码文件包,它旨在帮助用户通过编写和定制专属的表白程序来表达他们的情感。这个文件包不仅适合作为毕业设计或课程设计项目,而且也是一个绝佳的实践工具,用于提升编程技能和理解软件开发的全过程。该源码文件包含有多个模块,每个模块都经过精心设计,易于理解和修改,以适应不同的个性化需求。用户可以在这些模板的基础上进行二次开发,添加自己的创意元素,如特定的文本信息、背景音乐、动画效果等,使得表白程序更具个性和情感色彩。此外,源码文件包还附带详细的文档说明和注释,为初学者提供了丰富的学习资源。通过阅读和实践这些材料,学生能够深入理解编程语言的本质,提高解决实际问题的能力,并学会如何将理论知识应用到实际项目中。总之,“可二次开发程序员表白代码.rar”不仅是一个富有创意和技术挑战的项目,它还鼓励用户发挥想象力,用技术的方式传达爱意,是一份融合了情感与科技、教育与娱乐的独特礼物。问问助手:资深编程大师重新回答||

    数字同轴全息显微术中孪晶图像去除的神经网络方法matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    返回键退出程序的两种方式.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    浮动窗口.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    二维码扫描案例.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    基于matlab的CDMA

    写出所有n=5的m序列发生器的特征多项式,画出电路结构,仿真生成m序列并运算,画出其自相关和互相关曲线。

    基于单片机的智能家居环境监控系统的设计,单片机能够检测家居环境并显示,根据数据智能预警

    当今家居生活中面临各种环境与健康安全问题,如空气湿度过低,容易让人患上呼吸系统的疾病;CO、甲醛等有害气体危害人体健康;天燃气泄漏引起的爆炸事故频发等。人们对高品质生活环境的追求越来越强烈,所以居住环境的各种参数得到了大家的广泛重视。随着智能化与信息化的快速发展,我们可以利用现代科技对家居环境进行监测及调整,使我们的居住体验更加美好。 本设计完成一个可以监测温湿度、有害气体以及非法入侵的智能家居监控系统,包括主控模块、传感器模块、显示模块、报警驱动模块等。 系统的控制核心是STC89C52单片机,通过DHT11传感器来监测室内温湿度,烟雾传感器MQ-2监测有害气体烟雾浓度,HC-SR501传感器用来监测人体信号,按键电路可以设置监测数据上下限阈值及人体红外监测布防状态,当超过阈值时,蜂鸣器和LED灯声光报警,同时通过继电器驱动相应电器,实时对家居环境进行调控。此外,通过LCD1602液晶屏显示实时温湿度、烟雾浓度等信息供人们实时了解家庭环境状况,从而保证家庭生活环境的安全与舒适。

    网易推出的AI智能翻译平台,支持音频、文档、图片、字幕等.txt

    网易推出的AI智能翻译平台,支持音频、文档、图片、字幕等.txt

    NC65 UAP65 主子单据开发 带审批流 详细笔记

    NC65 UAP65 主子单据开发 带审批流 详细笔记,共同学习,共同进步。

    机械臂的碰撞检测研究.pdf

    机械臂的碰撞检测研究.pdf

    c语言-c语言编程基础之leetcode题解第23题合并K个升序链表.zip

    c语言 c语言_c语言编程基础之leetcode题解第23题合并K个升序链表

    Swift代码转换指南(Swift Swift Code Convension Guide .)

    【Swift】说明:Swift Swift代码转换指南。 (Swift Swift Code Convension Guide .) 文件列表: CODE_OF_CONDUCT.md LICENSE 【Swift】说明:Swift Swift代码转换指南。

    不确定性移动机械臂的轨迹跟踪控制研究.doc

    不确定性移动机械臂的轨迹跟踪控制研究.doc

    玖祺企业官网_v2.1.3.zip

    玖祺企业官网_v2.1.3

    s7200课题一_图文.ppt

    s7200课题一_图文.ppt

    仿网易新闻listview加header图片滚动,上拉下拉刷新.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

Global site tag (gtag.js) - Google Analytics