js分段上传文件
JS端。文件过大,开始使用了压缩文件后上传。后面改为分段上传,压缩文件部分没有做对应修改。
jx: function () { if (!$("#SearchForm").form('validate')) { return false; } var filepath = $("#importExcel").val().trim(); var laststr = filepath.substr(filepath.lastIndexOf(".")); if (filepath == "") { $.messager.alert('提示信息', '请选择要导入的文件!'); return; } else if (laststr != ".xls" && laststr != ".xlsx") { $.messager.alert('提示信息', '文件类型传入错误,请选择Excel文件!'); return; } //var formData = new FormData(); //formData.append("fileName", document.getElementById("importExcel").files[0].fileName); $.messager.progress({ 'text': '加载中', showType: 'fade' });//调用前打开 var excelFile = document.getElementById("importExcel").files[0]; var reader = new FileReader(); reader.readAsDataURL(excelFile); reader.onload = function () { var start = "data:application/vnd.ms-excel;base64,";//获得字符串的开始位置 var strBase64 = reader.result.substring(start.length); var zip = new JSZip(); // 向zip文件中添加图片,可以添加多个文件或者图片,此处以图片为例 // base64图片需要去掉base64图片标识 zip.file(excelFile.name, strBase64, { base64: true }); zip.generateAsync({ type: "base64", // 压缩类型 compression: "DEFLATE", // STORE:默认不压缩 DEFLATE:需要压缩 compressionOptions: { level: 9 // 压缩等级1~9 1压缩速度最快,9最优压缩方式 // [使用一张图片测试之后1和9压缩的力度不大,相差100字节左右] } }).then(function (content) { var allSize = content.length; var fromSize = 0; var ToSize = 0; var updSize = 50 * 1024; var paga = parseInt(((parseInt(allSize) / parseInt(updSize)) + 1)); var isOver = false; var isAsync = false;//最后一次用异步处理 var txtFileName = new Date().getTime() + ".txt"; $.messager.progress({ 'text': '加载中', showType: 'fade' });//调用前打开 for (var i = 0; i < paga; i++) { fromSize = i * updSize; ToSize = (i + 1) * updSize; if ((parseInt(fromSize) + parseInt(updSize)) > parseInt(allSize)) { isOver = true; isAsync = true; ToSize = allSize; } var blobcontent = content.slice(fromSize, ToSize); // 压缩的结果为blob类型(二进制流),可用作文件上传 $.ajax({ url: "/EKBMS/PrdctPlansUpload/ImportLoan1026", async: isAsync,//默认是true:异步,false:同步。 type: 'POST', data: { "fileExcelName": excelFile.name, "strBase64": blobcontent, "isOver": isOver, "txtFileName": txtFileName, "IndexCtn": i }, //data: { "fileExcelName": excelFile.name, "strBase64": blobcontent }, beforeSend: function () { //$.messager.progress({ 'text': '加载中', showType: 'fade' });//调用前打开 }, success: function (res) { if (!isOver) return; if (res.Result) { document.getElementById("ImportLoanform").reset(); $('#export').dialog('close') $.messager.progress('close');//回调后关闭 var Msg = res.Msg; $.messager.alert('提示信息', Msg); //导入成功后刷新页面数据 GetData(); } else { $.messager.progress('close');//回调后关闭 //执行解析失败 var Msg = res.Msg; $.messager.alert('提示信息 ', Msg); //$("#SearchForm")[0].reset(); } }, complete: function () { if (!isOver) return; $.messager.progress('close');//回调后关闭 }, error: function (er) { if (!isOver) return; $.messager.progress('close');//回调后关闭 $.messager.alert('提示信息', '操作失败!'); // $("#SearchForm")[0].reset(); } }); if (isOver) break; } }); }; reader.onerror = function (ex) { console.log("上传失败", ex) } //var xhr = new XMLHttpRequest(); ////post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。 //xhr.open("post", "/PrdctPlansUpload/ImportLoan", true); ////请求完成 //xhr.onload = this._uploadComplete; ////请求失败 //xhr.onerror = this._uploadFailed; ////开始上传,发送form数据 //xhr.send(formData); },
Controller端
/// <summary> /// 导入EXCLE /// </summary> /// <param name="importExcel"></param> /// <returns></returns> public JsonResult ImportLoan1026(string fileExcelName, string strBase64, bool isOver, string txtFileName, int IndexCtn) { //_Service.AddSysLog(ModuleCode.PrdctPlansUpload, OperateCode.Import, LogFlag.INFO, "进入方法ImportLoan成功!操作者:" + LoginUser.UserNo + "文件是否为空" + (importExcel == null).ToString(), null); string FilePath; FilePath = Server.MapPath("~/Excel") + "\\" + txtFileName; if (IndexCtn == 0) { System.IO.File.Create(FilePath).Close(); } //写入内容 FileStream fs = new FileStream(FilePath, FileMode.Append); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(strBase64); sw.Close(); fs.Close(); //如果不是最后一个,则在系统存一个零时txt,保存内容 if (!isOver) { return Json(new ResultPageModel<PrdctPlansImportModelVM> { Result = false, rows = null, Msg = "继续上传!" }); } //读取文件 strBase64 = string.Empty; FilePath = Server.MapPath("~/Excel") + "\\" + txtFileName; StreamReader sr = new StreamReader(FilePath, Encoding.Default); String line; while ((line = sr.ReadLine()) != null) { strBase64=strBase64+line.ToString(); } sr.Close(); List<PlanAllONE> lstPlan = new List<PlanAllONE>(); PlanAllVM _PlanAllVM = new PlanAllVM(); bool _IsSuc = true; string _Msg = string.Empty; List<PrdctPlansImportModelVM> LisPrdctPlan = new List<PrdctPlansImportModelVM>(); try { if (string.IsNullOrEmpty(strBase64)) { RespModel.WarningResult("上传的文件不能为空"); //return Json(RespModel, "text/html", JsonRequestBehavior.AllowGet); return Json(RespModel); } //将字符串转换为byte数组 byte[] bytes = Convert.FromBase64String(strBase64); var filePath = Server.MapPath("~/Excel"); var fileName_Zip = filePath + "\\" + fileExcelName.Substring(0, fileExcelName.IndexOf(".")) + ".Zip"; Bytes2File(bytes, filePath, fileExcelName); var fileName_Excel = string.Empty; //解压 UnpackFiles(fileName_Zip, filePath + "\\ExcelXLS", ref fileName_Excel); // 打开文件 FileStream fileStream = new FileStream(fileName_Excel, FileMode.Open, FileAccess.Read, FileShare.Read); // 读取文件的 byte[] byte[] bytes_New = new byte[fileStream.Length]; fileStream.Read(bytes_New, 0, bytes_New.Length); fileStream.Close(); // 把 byte[] 转换成 Stream Stream stream = new MemoryStream(bytes_New); //删除文件 ExcelDel(fileName_Zip); ExcelDel(fileName_Excel); ExcelDel(FilePath); return Json(new ResultPageModel<PrdctPlansImportModelVM> { Result = _IsSuc, rows = LisPrdctPlan, Msg = _Msg }); //return Json(new ResultPageModel<PrdctPlansImportModelVM> { Result = _IsSuc, rows = LisPrdctPlan, Msg = _Msg }, "text/html", JsonRequestBehavior.AllowGet); } catch (Exception ex) { _Service.AddSysLog(ModuleCode.PrdctPlansUpload, OperateCode.Import, LogFlag.ERROR, "导入的模板格式不正确,数据异常!", ex); //return Json(new ResultPageModel<PrdctPlansImportModelVM> { Result = false, rows = LisPrdctPlan, Msg = "导入异常!" }, "text/html", JsonRequestBehavior.AllowGet); return Json(new ResultPageModel<PrdctPlansImportModelVM> { Result = false, rows = LisPrdctPlan, Msg = "导入异常!" }); } }