本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天在研究批量导入功能,本节顺便简单搞搞导入、导出,等博主弄妥当了再来和大家一并分享。
.NET Core MVC上传首先我们来看看官网的上传的例子,再然后进行拓展训练,官网的表单是这样的。
<form method=enctype=asp-controller=asp-action=> <div > <div > <p>Upload one or more files using this form:</p> <input type=name=multiple /> </div> </div> <div > <div > <input type=value=/> </div> </div> </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()] public async Task<IActionResult> Post(List<IFormFile> files) { long size = files.Sum(f => f.Length); 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) { fileName = ContentDispositionHeaderValue .Parse(file.ContentDisposition) .FileName .Trim(); fileName = hostingEnv.WebRootPath + $; size += file.Length; using (FileStream fs = System.IO.File.Create(fileName)) { file.CopyTo(fs); fs.Flush(); } } ViewBag.Message = $; return View(); }
如上通过注入 private IHostingEnvironment hostingEnv; 来获取网站根目录路径。在前台表单中请求action方法用渲染的方式,如下:
<form method=enctype=asp-controller=asp-action=> </form>
当然别忘记添加TagHelper:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
成功上传我们显示上传字节大小,如下:
上传的文件在网站根目录下我们能够看到,如下:
上述我们只是牛刀小试通过表单提交,接下来我们进行拓展通过Ajax来提交。我们将表单类型submit修改为button,如下:
<div > <div > <div > <p>使用表单上传多个文件</p> <input type=name=multiple /> @ViewBag.Message </div> </div> </div> <div > <div > <div > <input type=id==style=value=/> </div> </div> </div>
我们通过FormData对象来获取文件从而进行Ajax提交,如下:
$(function () { $().click(function (evt) { ).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: , url: , 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) { fileName = ContentDispositionHeaderValue .Parse(file.ContentDisposition) .FileName .Trim(); fileName = hostingEnv.WebRootPath + $; size += file.Length; using (FileStream fs = System.IO.File.Create(fileName)) { file.CopyTo(fs); fs.Flush(); } } ViewBag.Message = $; return View(); }
到这里关于ASP.NET Core MVC中的上传就告一段落,还是比较简单但是算是比较常见的需求。
导入、导出Excel