媒介
本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天在研讨批量导入功用,本节趁便简朴搞搞导入、导出,等博主弄妥当了再来和人人一并分享。
.NET Core MVC上传
起首我们来看看官网的上传的例子,再然后举行拓展练习,官网的表单是如许的。
<form method="post" enctype="multipart/form-data" asp-controller="UploadFiles" asp-action="Index"> <p class="form-group"> <p class="col-md-10"> <p>Upload one or more files using this form:</p> <input type="file" name="files" multiple /> </p> </p> <p class="form-group"> <p class="col-md-10"> <input type="submit" value="上传" /> </p> </p> </form>
在ASP.NET Core MVC中吸收上传的文件须要用 IFormFile 来吸收,该接口定义以下:
public interface IFormFile { string ContentType { get; } string ContentDisposition { get; } IHeaderDictionary Headers { get; } long Length { get; } string Name { get; } string FileName { get; } Stream OpenReadStream(); void CopyTo(Stream target); Task CopyToAsync(Stream target, CancellationToken cancellationToken = null); }
背景控制器关于上传的Action要领举行以下定义:
[HttpPost("UploadFiles")] public async Task<IActionResult> Post(List<IFormFile> files) { long size = files.Sum(f => f.Length); // full path to file in temp location var filePath = Path.GetTempFileName(); foreach (var formFile in files) { if (formFile.Length > 0) { using (var stream = new FileStream(filePath, FileMode.Create)) { await formFile.CopyToAsync(stream); } } } return Ok(new { count = files.Count, size, filePath }); }
为了很清楚地上传文件地点目次,我们将官网例子举行一下革新。
public IActionResult UploadFiles(List<IFormFile> files) { long size = 0; foreach (var file in files) { //var fileName = file.FileName; var fileName = ContentDispositionHeaderValue .Parse(file.ContentDisposition) .FileName .Trim('"'); fileName = hostingEnv.WebRootPath + $@"\{fileName}"; size += file.Length; using (FileStream fs = System.IO.File.Create(fileName)) { file.CopyTo(fs); fs.Flush(); } } ViewBag.Message = $"{files.Count}个文件 /{size}字节上传胜利!"; return View(); }
如上经由过程注入 private IHostingEnvironment hostingEnv; 来猎取网站根目次途径。在前台表单中要求action要领用衬着的体式格局,以下:
<form method="post" enctype="multipart/form-data" asp-controller="Upload" asp-action="UploadFiles"> </form>
固然别忘记增加TagHelper:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
胜利上传我们显现上传字节大小,以下:
上传的文件在网站根目次下我们可以看到,以下:
上述我们只是牛刀小试经由过程表单提交,接下来我们举行拓展经由过程Ajax来提交。我们将表单范例submit修正成button,以下:
<p class="row"> <p class="form-group"> <p class="col-md-10"> <p>运用表单上传多个文件</p> <input type="file" id="files" name="files" multiple /> @ViewBag.Message </p> </p> </p> <p class="row"> <p class="form-group"> <p class="col-md-10"> <input type="button" id="upload" class="btn btn-success" style="cursor:pointer;width:100px;" value="上传" /> </p> </p> </p>
我们经由过程FormData对象来猎取文件从而举行Ajax提交,以下:
$(function () { $("#upload").click(function (evt) { var fileUpload = $("#files").get(0); var files = fileUpload.files; var data = new FormData(); for (var i = 0; i < files.length ; i++) { data.append(files[i].name, files[i]); } $.ajax({ type: "POST", url: "/Upload/UploadFiles", contentType: false, processData: false, data: data, success: function (message) { alert(message); }, error: function () { alert("上传文件涌现毛病!"); } }); }); });
此时背景则须要举行轻微修正,我们不再须要IFormFile接口来猎取文件,经由过程要求中的表单猎取,以下:
public IActionResult UploadFiles() { long size = 0; var files = Request.Form.Files; foreach (var file in files) { //var fileName = file.FileName; var fileName = ContentDispositionHeaderValue .Parse(file.ContentDisposition) .FileName .Trim('"'); fileName = hostingEnv.WebRootPath + $@"\{fileName}"; size += file.Length; using (FileStream fs = System.IO.File.Create(fileName)) { file.CopyTo(fs); fs.Flush(); } } ViewBag.Message = $"{files.Count}个文件 /{size}字节上传胜利!"; return View(); }
到这里关于ASP.NET Core MVC中的上传就告一段落,照样比较简朴然则算是比较罕见的需求。
导入、导出Excel
项目中须要用到批量导入和导出因而举行了一点研讨,.net core刚降生时还未有关于.net core中Excel的导出,然则见过园中有热情园友分享并制作了.net core中导出Excel,然则博主发如今2月19号有老外已针对.net core的Excel导出和导入现在版本为1.3基于EPPlus,功用和EPPlus差不多,不过是移植到了.net core中,下面我们一起来看看。起首我们下载EPPlus.Core程序包,以下:
我们直接上导出代码:
[HttpGet] [Route("Export")] public string Export() { string sWebRootFolder = _hostingEnvironment.WebRootPath; string sFileName = @"Jeffcky.xlsx"; string URL = string.Format("{0}://{1}/{2}", Request.Scheme, Request.Host, sFileName); FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName)); if (file.Exists) { file.Delete(); file = new FileInfo(Path.Combine(sWebRootFolder, sFileName)); } using (ExcelPackage package = new ExcelPackage(file)) { // add a new worksheet ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Jeffcky"); //sheet header worksheet.Cells[1, 1].Value = "ID"; worksheet.Cells[1, 2].Value = "Name"; worksheet.Cells[1, 3].Value = "Age"; //Add values worksheet.Cells["A2"].Value = 1000; worksheet.Cells["B2"].Value = "Jeffcky1"; worksheet.Cells["C2"].Value = 18; worksheet.Cells["A3"].Value = 1001; worksheet.Cells["B3"].Value = "Jeffcky2"; worksheet.Cells["C3"].Value = 19; package.Save(); //Save the workbook. } return URL; }
这里我们举行一致封装下来举行导出只须要设置导出属性和列表数据即可,以下:
public IActionResult Export() { var properties = new PropertyByName<Person>[] { new PropertyByName<Person>("Id",d=>d.Id), new PropertyByName<Person>("Name",d=>d.Name), new PropertyByName<Person>("Age",d=>d.Age) }; var list = new List<Person>() { new Person() {Id=1,Name="Jeffcky1",Age=18 }, new Person() {Id=2,Name="Jeffcky2",Age=19 }, new Person() {Id=3,Name="Jeffcky3",Age=20 }, new Person() {Id=4,Name="Jeffcky4",Age=21 }, new Person() {Id=5,Name="Jeffcky5",Age=22 } }; var bytes = _ExportManager.ExportToXlsx<Person>(properties, list); return new FileContentResult(bytes, MimeTypes.TextXlsx); }
说完导出我们再来看导入,我们来读取方才导入的数据返回到页面上:
public string Import() { string sWebRootFolder = _hostingEnvironment.WebRootPath; string sFileName = @"Jeffcky.xlsx"; FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName)); try { using (ExcelPackage package = new ExcelPackage(file)) { StringBuilder sb = new StringBuilder(); ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; int rowCount = worksheet.Dimension.Rows; int ColCount = worksheet.Dimension.Columns; bool bHeaderRow = true; for (int row = 1; row <= rowCount; row++) { for (int col = 1; col <= ColCount; col++) { if (bHeaderRow) { sb.Append(worksheet.Cells[row, col].Value.ToString() + "\t"); } else { sb.Append(worksheet.Cells[row, col].Value.ToString() + "\t"); } } sb.Append(Environment.NewLine); } return sb.ToString(); } } catch (Exception ex) { return "Some error occured while importing." + ex.Message; } }
此时我们再来对导入举行一致封装下,以下:
[HttpGet] [Route("Import")] public void Import() { string sWebRootFolder = _hostingEnvironment.WebRootPath; string sFileName = @"Jeffcky.xlsx"; FileStream fs = new FileStream(Path.Combine(sWebRootFolder, sFileName), FileMode.Open, FileAccess.Read, FileShare.Read); var list = _ImportManager.ImportPersonFromXlsx(fs); }
导入也许就引见终了了,要我说真正的难点不在于应用EPPlus导入和导出,难点在于批量导入,批量举行导入后对数据花样的磨练,假如给定一个导入模板,然后再导入批量数据怎样确保用户给的数据花样完全是准确的以及数据没有反复的校验,这两天基本上是完成了批量的导入,也许分为:数据必填项的校验、数据花样的校验、数据库是不是存在数据的校验、数据导入部份导入失利返回花样的用户体验。当应用NPOI、EPPlus来导入和导出如许的功用再简朴不过了,然则假如遇到了差别的场景怎样让用户体验更好的运用这是一个题目,假如数据导入失利我们怎样去提醒用户呢,另有假如Excel中有下拉框和兼并的单元格数据我们怎样去猎取这又是一个题目,能够许多简历上写着会应用NPOI和EPPlus的导入和导出,实在没什么看头,两者不过是一个东西罢了,怎样应用东西去应用到庞杂的场景并举例那才算是高等的东西。
总结
本节我们轻微引见了.net core中的下载、导入和导出,假如有能够的话后续会给出关于EPPlus中高等的学问,比方如上提出的猎取兼并列数据另有猎取图片等等,我们下节再见,哦,关于SQL Server有时间会按期举行更新,see u。
以上就是ASP.NET Core MVC上传、导入、导出详解的细致内容,更多请关注ki4网别的相干文章!