一、实现步骤

  在用户操作界面,由用户选择需要下载的文件,系统根据所选文件,在服务器上创建用于存储所选文件的临时文件夹,将所选文件拷贝至临时文件夹。然后调用 RAR程序,对临时文件夹进行压缩,然后输出到客户端。最后删除临时文件夹。

二、代码实现

1、ASP.NET批量下载 核心代码


//遍历服务器指定文件夹下的所有文件stringpath="uploads/Image/";stringserverPath=Server.MapPath(path);//创建临时文件夹stringtempName=DateTime.Now.ToString("yyyyMMddHHMMss");stringtempFolder=Path.Combine(serverPath,tempName);Directory.CreateDirectory(tempFolder);DirectoryInfofolder=newDirectoryInfo(serverPath);foreach(FileInfofileinfolder.GetFiles()){stringfilename=file.Name;File.Copy(serverPath+"/"+filename,tempFolder+"/"+filename);}//ZKHelper.JSHelper.Alert("图片拷贝成功!");//产生RAR文件,及文件输出RARSave(tempFolder,tempName);DownloadRAR(tempFolder+"\\\\"+tempName+".rar");


2、RARSave(string tempFolder, string tempName) 方法

///<summary>///生成RAR文件///</summary>///<paramname="path">存放复制文件的目录</param>///<paramname="rarPatch">RAR文件存放目录</param>///<paramname="rarName">RAR文件名</param>privatevoidRARSave(stringrarPatch,stringrarName){stringthe_rar;RegistryKeythe_Reg;Objectthe_Obj;stringthe_Info;ProcessStartInfothe_StartInfo;Processthe_Process;try{the_Reg=Registry.ClassesRoot.OpenSubKey(@"WinRAR");the_Obj=the_Reg.GetValue("");the_rar=the_Obj.ToString();the_Reg.Close();the_rar=the_rar.Substring(1,the_rar.Length-7);the_Info="a"+rarName+"-r";the_StartInfo=newProcessStartInfo();the_StartInfo.FileName="WinRar";//the_rar;the_StartInfo.Arguments=the_Info;the_StartInfo.WindowStyle=ProcessWindowStyle.Hidden;//打包文件存放目录the_StartInfo.WorkingDirectory=rarPatch;the_Process=newProcess();the_Process.StartInfo=the_StartInfo;the_Process.Start();the_Process.WaitForExit();the_Process.Close();}catch(Exception){throw;}}

3、DownloadRAR(string file)方法

///<summary>///下载生成的RAR文件///</summary>privatevoidDownloadRAR(stringfile){FileInfofileInfo=newFileInfo(file);Response.Clear();Response.ClearContent();Response.ClearHeaders();Response.AddHeader("Content-Disposition","p_w_upload;filename="+fileInfo.Name);Response.AddHeader("Content-Length",fileInfo.Length.ToString());Response.AddHeader("Content-Transfer-Encoding","binary");Response.ContentType="application/octet-stream";Response.ContentEncoding=System.Text.Encoding.GetEncoding("gb2312");Response.WriteFile(fileInfo.FullName);Response.Flush();stringtempPath=file.Substring(0,file.LastIndexOf("\\\\"));//删除临时目录下的所有文件DeleteFiles(tempPath);//删除空目录Directory.Delete(tempPath);Response.End();}

4、DeleteFiles(stringtempPath) 方法

///<summary>///删除临时目录下的所有文件///</summary>///<paramname="tempPath">临时目录路径</param>privatevoidDeleteFiles(stringtempPath){DirectoryInfodirectory=newDirectoryInfo(tempPath);try{foreach(FileInfofileindirectory.GetFiles()){if(file.Attributes.ToString().IndexOf("ReadOnly")!=-1){file.Attributes=FileAttributes.Normal;}File.Delete(file.FullName);}}catch(Exception){throw;}}