【转】.net core webapi 上传图片
原文地址:https://blog.csdn.net/weixin_41600552/article/details/83015725
[HttpPost("api/QualificationOne/Upload")] public ActionResult Upload(IFormCollection Files, int EntId, int CrtUser) { try { //var form = Request.Form;//直接从表单里面获取文件名不需要参数 string dd= Files["File"]; var form = Files;//定义接收类型的参数 Hashtable hash = new Hashtable(); IFormFileCollection cols = Request.Form.Files;
//cols=Files.Files; if (cols == null || cols.Count == 0) { return Json(new { status = -1, message = "没有上传文件", data = hash }); } foreach (IFormFile file in cols) { //定义图片数组后缀格式 string[] LimitPictureType = { ".JPG", ".JPEG", ".GIF", ".PNG", ".BMP" }; //获取图片后缀是否存在数组中 string currentPictureExtension = Path.GetExtension(file.FileName).ToUpper(); if (LimitPictureType.Contains(currentPictureExtension)) { //为了查看图片就不在重新生成文件名称了 // var new_path = DateTime.Now.ToString("yyyyMMdd")+ file.FileName; var new_path = Path.Combine("uploads/images/", file.FileName); var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", new_path); using (var stream = new FileStream(path, FileMode.Create)) { //图片路径保存到数据库里面去 bool flage= QcnApplyDetm.FinancialCreditQcnApplyDetmAdd(EntId, CrtUser, new_path); if (flage == true) { //再把文件保存的文件夹中 file.CopyTo(stream); hash.Add("file", "/" + new_path); } } } else { return Json(new { status = -2, message = "请上传指定格式的图片", data = hash }); } } return Json(new { status = 0, message = "上传成功", data = hash }); } catch (Exception ex) { return Json(new { status = -3, message = "上传失败", data = ex.Message }); } }
这里有几个重点:
1:引用 IFormCollection 类 获取 Asp.Net.Core 中 Http 请求的一个类,就可以直接获取form表单中的参数,因为 ASP.NET Core 中,没有了 IIS ,它的 HttpContext 只能用 IFormCollection 生成获取form表单中的数据
命名空间为 :namespace Microsoft.AspNetCore.Http
2: 引用 IFormFileCollection 类 获取上传图片的文件名
命名空间为 :namespace Microsoft.AspNetCore.Http
IFormFile GetFile(string name);,获取一张图片的名称
IReadOnlyList<IFormFile> GetFiles(string name);获取多张图片的名称
3:创建一个 Hashtable hash = new Hashtable(); 类 保存图片路劲进行返回数据
总结:
asp.net mvc 与 asp.net core 中上传图片区别点是
net core没有httpContext 不能采用这种方式获取 http请求中的form 数据,只能使用 IFormCollection 接口类
实战
////// 上传处方图片 /////////public TDataUploadRcpImg(IFormCollection uploadfiles, string OrgId, string RcpNo) { var response = IsValid(uploadfiles, OrgId,RcpNo); if (response.Tag != 1) return new TData(0, response.Message); var realOrgId = response.Data; if (uploadfiles == null || uploadfiles.Files==null || uploadfiles.Files.Count <= 0) return new TData(0, "图片不能为空!"); var file = uploadfiles.Files[0]; //定义图片数组后缀格式 var LimitPictureType = new List(); LimitPictureType.Add(".png"); //获取图片后缀是否存在数组中 string currentPictureExtension = Path.GetExtension(file.FileName).ToLower(); if (!LimitPictureType.Contains(currentPictureExtension)) { return new TData(0, "请上传指定格式的图片!"); } var rcpMainImgFolder = $@"{AppDomain.CurrentDomain.BaseDirectory}\Resource\RcpMainImg\{realOrgId}\"; var relativeFilePath = $@"Resource\RcpMainImg\{realOrgId}\{RcpNo + currentPictureExtension}"; var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, relativeFilePath); //图片存储文件的路径. try { #region --处理文件夹及文件-- if (!Directory.Exists(rcpMainImgFolder)) Directory.CreateDirectory(rcpMainImgFolder); if (System.IO.File.Exists(filePath) == true)//删除原文件 { try { System.IO.File.Delete(filePath); } catch (Exception) //上传异常处理 { } } #endregion using (var stream = new FileStream(filePath, FileMode.Create)) { //再把文件保存的文件夹中 file.CopyTo(stream); } } catch (Exception ex) { LogHelper.Error($"图片上传失败[CorpCode={OrgId},OrgId={realOrgId},RcpNo={RcpNo}]",ex); return new TData(0, "上传失败!"); } return new TData(1, "success!") { Data= relativeFilePath }; }
可以用实体映射参数
public TData<UploadFileEntity> SaveFiles([FromQuery] UploadFileListParam model, [FromQuery] IFormCollection fileList)