上個星期,老大根據項目的最佳化需求,讓我搞定上傳檔案夾,以前完全沒有搞過這個,上傳單個檔案,上傳多個檔案沒有問題,上傳檔案夾?完全無從下手,百度之下也是鳳毛麟角,思路不多。asp.net是沒有直接選取檔案夾的控制項的,我也不知道,如果大家有的話可以一起交流下。後來我想著應該有三種方法:①先將檔案夾壓縮後上傳伺服器,然後再伺服器上解壓;②獲得檔案夾名及目錄,然後遍曆檔案夾下面的檔案以及子檔案夾,迴圈上傳;③是使用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 System.IO; 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 try41 {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 IsReusable62 {63 get64 {65 return false;66 }67 } 68 }
原本以為這樣就可以達到效果,但是卻發現了一個致命的問題!因為Fileupload控制項本身是不支援檔案夾的上傳,即使通過ashx也無法賦值給它。通過瞭解更多資料,得知,由於安全性原因,不可能直接在瀏覽器上通過代碼直接上傳本地檔案夾,必須通過ActiveX控制項才能實現。
從安全許可權來分析,確實也是不允許的,否則我寫一個網頁,裡面嵌入這段js代碼,你一開啟這個網頁,js就可以開始慢慢的去遍曆你的硬碟,把你的檔案都上傳到伺服器。只有使用者通過input控制項自己選擇的檔案,才允許上傳。因此,使用本方法上傳檔案只能宣布失敗!!如果有朋友能夠實現的話,歡迎與我聯絡!