年前要實現批量下載文件ajax
由於快放假一直沒有心情寫json
年後回來第一件事就是完成批量下載文件服務器
使用原來的方法一直沒法實現,只能實現單條記錄下載app
仍是在網上搜到的方法async
本身改了改post
$(".plxz").click(function () { debugger; var ids = new Array(); $('.checkboxes').each(function () { if (this.checked == true) { ids.push(this.value); } }) debugger; $.ajax({ url: '/HOS/Apprentice/DownloadFile', cache: false, async: true, type: 'post', contentType: 'application/json', data: JSON.stringify(ids), success: function (data) { alert("下載完成"); } }); })
上面的代碼爲點擊批量下載按鈕時的ajax請求this
[HttpPost] public FileResult DownloadFile(List<string> list) { //獲取服務器中的文件路徑 string filePath = Server.MapPath("~/Files/masterpapers/2017-1/"); //要壓縮的文件夾,把須要打包的文件存放在此文件夾 string dPath = @"E:\文件"; //壓縮後的文件存放路徑 string destFile = @"E:\文件\Download"; if (list.Count > 1) { foreach (string fileName in list) { string sourceFileName = Path.Combine(filePath, fileName); string destFileName = Path.Combine(dPath, fileName); //true爲覆蓋同名文件 System.IO.File.Copy(sourceFileName, destFileName, true); } //FileDown fileDown = new FileDown(); //返回壓縮後的文件提供下載 ZipFileFromDirectory(dPath, destFile, 9); //參數爲文件存放路徑,下載的文件格式,文件名字 return File(destFile, "application/octet-stream", Path.GetFileName(destFile)); } else { //單個文件下載,不須要打包 foreach (string fileName in list) { string sourceFileName = Path.Combine(filePath, fileName); string destFileName = Path.Combine(dPath, fileName) + ".xls"; System.IO.File.Copy(sourceFileName, destFileName, true); } //參數爲文件存放路徑,下載的文件格式,文件名字 return File(destFile, "application/csv", Path.GetFileName(destFile)); } }
上面的方法爲控制器中DownloadFile方法url
ZipFileFromDirectory 這個方法主要是將下載文件進行壓縮,用不到的能夠忽略
public void ZipFileFromDirectory(string rootPath, string destinationPath, int compressLevel) { GetAllDirectories(rootPath); //獲得當前路徑的位置,以備壓縮時將所壓縮內容轉變成相對路徑。 string rootMark = rootPath + "\\"; //Crc32校驗 Crc32 crc = new Crc32(); //zip輸出類 ZipOutputStream outPutStream = new ZipOutputStream(System.IO.File.Create(destinationPath)); // 0-9程序的壓縮,設置壓縮程度 outPutStream.SetLevel(compressLevel); //將文件讀入壓縮流 foreach (string file in files) { FileStream fileStream = System.IO.File.OpenRead(file); byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); //設置文件的一些參數 ZipEntry entry = new ZipEntry(file.Replace(rootMark, string.Empty)); entry.DateTime = DateTime.Now; entry.Size = fileStream.Length; fileStream.Close(); //計算Crc32檢驗碼 crc.Reset(); crc.Update(buffer); //設置校驗碼 entry.Crc = crc.Value; //將當前文件的zip文件流寫入輸出流 outPutStream.PutNextEntry(entry); outPutStream.Write(buffer, 0, buffer.Length); } this.files.Clear(); foreach (string emptyPath in paths) { ZipEntry entry = new ZipEntry(emptyPath.Replace(rootMark, string.Empty) + "/"); outPutStream.PutNextEntry(entry); } this.paths.Clear(); outPutStream.Finish(); outPutStream.Close(); GC.Collect(); }
取得目錄下全部文件和文件夾
/// <summary> /// 取得目錄下全部文件及文件夾,分別存入files及paths /// </summary> /// <param name="rootPath">根目錄</param> private void GetAllDirectories(string rootPath) { //獲取全部的子目錄 string[] subPaths = Directory.GetDirectories(rootPath); foreach (string path in subPaths) { //找到子目錄並將當前目錄的文件名存入List GetAllDirectories(path); } string[] files = Directory.GetFiles(rootPath); foreach (string file in files) { //將當前目錄中的全部文件全名存入文件list this.files.Add(file); } //判斷是不是空目錄 if (subPaths.Length == files.Length && files.Length == 0) { //若是是空目錄則記錄空目錄 this.paths.Add(rootPath); } }