1、获取要下载文件的ID
function btn_downfile() { var rows = $("#gridTable").datagrid('getChecked'); if (rows.length == 0) { dialogMsg("至少勾选一条数据", 1); return false; } var fileIds = ""; for (var i = 0; i < rows.length; i++) { fileIds += rows[i]["AttachmentID"] + ","; } fileIds = fileIds.substr(0, fileIds.length - 1); $("#formexcel").remove(); var $form = $("<form id='formexcel' method='post' action='/HR/Employee/DownDocumentFile' style='display:none;'>"); var $input = $("<input type='hidden' name='FileIds' value='" + fileIds + "'>"); $("body").append($form); $form.append($input); $form.submit(); }
2、根据文件ID获取文件的请求地址
/// <summary> /// 文件打包下载 /// </summary> /// <param name="EmpNo">工号</param> /// <param name="FileIds">文件ID</param> /// <returns></returns> [HttpPost] public ActionResult DownDocumentFile(string EmpNo, string FileIds) { if (string.IsNullOrEmpty(FileIds)) { return Error("请勾选数据!"); } if (string.IsNullOrEmpty(EmpNo)) { EmpNo = "file"; } AttachmentBiz attBiz = new AttachmentBiz(); var fileList = attBiz.GetListEntity(FileIds);//根据文件ID获取文件地址数据 if (fileList.Count > 0) { var streamList= GetFileStreamList(fileList); //zip 文件名称 var zipFileName = EmpNo + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip"; MemoryStream ms = new MemoryStream(); byte[] buffer; using (ZipFile file = ZipFile.Create(ms)) { file.BeginUpdate(); foreach (var item in streamList) { StreamDataSource sd = new StreamDataSource(item.FileStream); file.Add(sd, item.Name); } file.CommitUpdate(); buffer = new byte[ms.Length]; ms.Position = 0; ms.Read(buffer, 0, buffer.Length); } return File(ms.ToArray(), "application/zip", zipFileName); } else { throw new Exception("文件不能为空!"); } }
3、通过请求文件地址获取文件流
/// <summary> /// 获取文件流 /// </summary> /// <param name="list"></param> private List<DownloadModel> GetFileStreamList(List<AttachmentEntity> list) { try { EmployeeBiz employeeBiz = new EmployeeBiz(); var empList = employeeBiz.GetAllEmployeeList();//获取用户数据 List<DownloadModel> downloadList = new List<DownloadModel>(); foreach (var item in list) { var empentity = empList.Where(x => x.UserID == item.DocumentID).First(); string filename = item.AttachmentType + "_" + empentity.EmployeeNo + "_" + empentity.FullNameCN + "_" + item.Title; WebRequest req = WebRequest.Create(item.Url); req.Method = "GET"; //读取到内存 MemoryStream stmMemory = new MemoryStream(); using (WebResponse webRes = req.GetResponse()) { int length = (int)webRes.ContentLength; HttpWebResponse response = webRes as HttpWebResponse; Stream stream = response.GetResponseStream(); byte[] buffer = new byte[length]; int i; //将字节逐个放入到Byte中 while ((i = stream.Read(buffer, 0, buffer.Length)) > 0) { stmMemory.Write(buffer, 0, i); } } DownloadModel downloadModel = new DownloadModel(); downloadModel.ID = Guid.NewGuid().ToString(); downloadModel.Name = filename; downloadModel.FileStream = stmMemory; downloadList.Add(downloadModel); } return downloadList; } catch (System.Exception ex) { throw ex; } }