压缩文件相关的类:
public class ZIPCompressUtil { public static Tuple<bool, Stream> Zip(string strZipTopDirectoryPath, int intZipLevel, string strPassword, string[] filesOrDirectoriesPaths) { try { List<string> AllFilesPath = new List<string>(); if (filesOrDirectoriesPaths.Length > 0) // get all files path { for (int i = 0; i < filesOrDirectoriesPaths.Length; i++) { if (File.Exists(filesOrDirectoriesPaths[i])) { AllFilesPath.Add(filesOrDirectoriesPaths[i]); } else if (Directory.Exists(filesOrDirectoriesPaths[i])) { GetDirectoryFiles(filesOrDirectoriesPaths[i], AllFilesPath); } } } if (AllFilesPath.Count > 0) { MemoryStream ms = new MemoryStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(ms); zipOutputStream.SetLevel(intZipLevel); zipOutputStream.Password = strPassword; for (int i = 0; i < AllFilesPath.Count; i++) { string strFile = AllFilesPath[i]; try { if (Directory.Exists(strFile)) //folder { string strFileName = strFile.Replace(strZipTopDirectoryPath, ""); if (strFileName.StartsWith("")) { strFileName = strFileName.Substring(0); } ZipEntry entry = new ZipEntry(strFileName + "/"); entry.DateTime = DateTime.Now; zipOutputStream.PutNextEntry(entry); } else //file { FileStream fs = File.OpenRead(strFile); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string strFileName = strFile.Replace(strZipTopDirectoryPath, ""); if (strFileName.StartsWith("")) { strFileName = strFileName.Substring(0); } ZipEntry entry = new ZipEntry(strFileName); entry.DateTime = DateTime.Now; zipOutputStream.PutNextEntry(entry); zipOutputStream.Write(buffer, 0, buffer.Length); fs.Close(); fs.Dispose(); } } catch { continue; } } zipOutputStream.Finish(); return new Tuple<bool, Stream>(true, ms); } else { return new Tuple<bool, Stream>(false, null); } } catch { return new Tuple<bool, Stream>(false, null); } } private static void GetDirectoryFiles(string strParentDirectoryPath, List<string> AllFilesPath) { string[] files = Directory.GetFiles(strParentDirectoryPath); for (int i = 0; i < files.Length; i++) { AllFilesPath.Add(files[i]); } string[] directorys = Directory.GetDirectories(strParentDirectoryPath); for (int i = 0; i < directorys.Length; i++) { GetDirectoryFiles(directorys[i], AllFilesPath); } if (files.Length == 0 && directorys.Length == 0) //empty folder { AllFilesPath.Add(strParentDirectoryPath); } } }
调用并提供下载的方法
public ActionResult Export() { List<long> productIds = null; var url = Request.RawUrl; if (url.Contains("?")) { string paramStr = url.Substring(url.LastIndexOf("?")); string[] paramArray = paramStr.Split('&'); productIds = paramArray .Select(item => item.Split('=').Length > 1 ? item.Split('=')[1] : "0") .Select(value => value.TryLong(0)).ToList(); } if (Directory.Exists(Server.MapPath("~/上架商品"))) { Directory.Delete(Server.MapPath("~/上架商品"), true); } var productlist = ProductOnSaleService.Instance.GetProductSkuImgsExportList(productIds); foreach (var productItem in productlist) { var dir = Server.MapPath("~/上架商品/") + productItem.ProductId + "-" + productItem.LongName; if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } foreach (var skuItem in productItem.Skus) { Bitmap rqBtimap = QrCodeHelper.Encode(BizKeyValService.Instance.Get(EnumBizKey.ProductShareUrl).BizVal + "?id=" + productItem.ProductId + "&skuid=" + skuItem.SkuId, 430, 430); rqBtimap.Save(dir + "/" + productItem.ProductId + "-" + skuItem.SkuId + "-" + skuItem.SkuName + ".jpg"); } } var strZipTopDirectoryPath = Server.MapPath("~/"); const int intZipLevel = 6; const string strPassword = ""; var filesOrDirectoriesPaths = new string[] { Server.MapPath("~/上架商品") }; var result = ZIPCompressUtil.Zip(strZipTopDirectoryPath, intZipLevel, strPassword, filesOrDirectoriesPaths); var buffer = new byte[result.Item2.Length]; result.Item2.Position = 0; result.Item2.Read(buffer, 0, buffer.Length); result.Item2.Close(); Response.AppendHeader("content-disposition", "attachment;filename=上架商品.zip"); Response.BinaryWrite(buffer); Response.Flush(); Response.End(); return new EmptyResult(); }
js代码
$("#btnExpress").click(function () { var selectedList = $.getSelectId(true); if (selectedList.length == 0) { $.alert("请选择商品"); return; } var url = "/Product/ProductOnSale/Export"; for (var i = 0; i < selectedList.length; i++) { url = (i == 0 ? url + "?param" + i + "=" + selectedList[i].toString() : url + "¶m" + i + "=" + selectedList[i].toString()); } location.href = url; });