C# 遍历文件夹之后上传文件夹下的所有文件(失败解析)
[来源] 达内 [编辑] 达内 [时间]2012-10-23
上个星期,老大根据项目的优化需求,让我搞定上传文件夹,以 完全没有搞过这个,上传单个文件,上传多个文件没有问题,上传文件夹?完全无从下手,百度之下也是凤毛麟角,思路不多。 是没有直接选取文件夹的控件的,我也不知道,如果大家有的话可以一起交流下。 后来我想着应该有三种方法:①先将文件夹压缩后上传服务器,然后再服务器上解压;②获得文件夹名及目录,然后遍历文件夹下面的文件以及子文件夹,循环上传;③是使用AcitiveX控件。老大同意了第二种。
那我果断就先通过上传对话框获得文件夹名和文件夹所在的系统文件路径,可是接下来就错愕了,一开始是想使用javascript遍历文件夹的
1 var fso = new ActiveXObject("Scripting.FileSystemObject"); 2 var f = fso.GetFolder(document.all.fixfolder.value); 3 var fc = new Enumerator(f.files);
但是发现遍历不了,才得知要想创建FSO对象,操作文件,必须对该文件要有足够的权限才行,这样太麻烦了,于是我采取用C#来遍历文件夹,通过写一个ashx文件,在html里通过action将浏览的数据传送过来
1 <%@ WebHandler Language="C# " Class=" folder " %> 2 3 using System; 4 using System.Web; 5 using ; 6 7 public class folder : IHttpHandler 8 { 9 //采用递归的方式遍历,文件夹和子文件中的所有文件。 10 public void ProcessRequest(HttpContext context) 11 { 12 HttpRequest Request = context.Request; 13 HttpResponse Response = context.Response; 14 HttpServerUtility Server = context.Server; 15 // 指定输出头和编码 16 Response.ContentType = " text/html" ; 17 Response.Charset = " utf-8" ; 18 19 HttpFileCollection fs = HttpContext.Current.Request.Files; 20 string newFilePath = Request.Form["sPath " ]; 21 if(fs.Count>0 ) 22 { 23 // fs[0]对应FindFile的dirPath就是指定目录,newFilePath绝对赢svrPath就是目标目录,也就是服务器上的目录 24 FindFile(fs[0 ].ToString(), newFilePath); 25 } 26 Response.Write(" <script>parent.FileUploadDeal()</script>" ); 27 } 28 // 采用递归的方式遍历,文件夹和子文件中的所有文件。 29 public void FindFile(string dirPath,string svrPath) //参数dirPath为指定的目录,svrPath是目标目录 30 { 31 // 目标目录,也就是服务器上的目录 32 string sFilePath = System.Web.HttpContext.Current.Server.MapPath(svrPath); 33 // string sFilePath = System.Web.HttpContext.Current.Server.MapPath(Request.Form["svrPath"]); 34 // 创建文件夹 35 if (!Directory.Exists(sFilePath)) 36 Directory.CreateDirectory(sFilePath); 37 38 // 在指定目录及子目录下查找文件 39 DirectoryInfo Dir=new DirectoryInfo(dirPath); 40 try 41 { 42 foreach (DirectoryInfo d in Dir.GetDirectories())//查找子目录 43 { 44 FindFile(Dir+d.ToString()+" \\",svrPath+d.ToString()+" \\" ); 45 // FindFile(Dir+d.ToString()+"\",svrPath+d.ToString()+"\"); 46 } 47 foreach (FileInfo f in Dir.GetFiles()) //查找文件 48 { 49 // f.SaveAs(Server.MapPath(svrPath + f.ToString()));// 如果要保存到其他地方,注意修改这里50 f.CopyTo(System.Web.HttpContext.Current.Server.MapPath(svrPath + f.ToString()), true ); 51 HttpContext.Current.Response.Write("4554132 "); 52 } 53 } 54 catch (Exception e) 55 { 56 ; 57 } 58 59 } 60 61 public bool IsReusable 62 { 63 get 64 { 65 return false ; 66 } 67 } 68 }
原本以为这样就可以达到效果,但是却发现了一个致命的问题! 因为Fileupload控件本身是不支持文件夹的上传,即使通过ashx也无法赋值给它。通过了解更多资料,得知,由于安全性原因,不可能直接在浏览器上通过代码直接上传本地文件夹,必须通过ActiveX控件才能实现。
从安全权限来分析,确实也是不允许的,否则我写一个网页,里面嵌入这段js代码,你一打开这个网页,js就可以开始慢慢的去遍历你的硬盘,把你的文件都上传到服务器。只有用户通过input控件自己选择的文件,才允许上传。因此,使用本方法上传文件只能宣布失败!!如果有朋友能够实现的话,欢迎与我联系!