mvc 批量下載文件

年前要實現批量下載文件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);
            }
        }
相關文章
相關標籤/搜索