千家信息网

ASP.NET MVC如何实现文件上传

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍ASP.NET MVC如何实现文件上传,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Upload File(一)我们在默认创建的项目中的Home控制器下添加如下
千家信息网最后更新 2026年11月04日ASP.NET MVC如何实现文件上传

这篇文章主要介绍ASP.NET MVC如何实现文件上传,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Upload File(一)
我们在默认创建的项目中的Home控制器下添加如下:

  public ActionResult UploadFile()  {   return View();  }  [HttpPost]  public ActionResult UploadFile(HttpPostedFileBase file)  {   var fileName = file.FileName;   var filePath = Server.MapPath(string.Format("~/{0}", "File"));   file.SaveAs(Path.Combine(filePath, fileName));   return View();  }

在 UploadFile 视图中添加上如下:


有关视图中我们就不必多说,只需明白如下两点:

(1)在后台利用HttpPostedFileBase来接收上传文件,该类为一个抽象类,但在ASP.NET Web Form却没有此类,此类的出现是为了更好的进行单元测试。

(2)在视图中文件类型的name要和后台接收文件的参数一致。

接下来我们进行演示看看结果:

上述我们简单的上传了一个Excel文件,下面我们通过强类型视图以及模型验证来强化上传。

Upload File(二)
我们创建如下BlogModel类:

 public class BlogModel {  [Display(Name = "博客名称")]  [Required(ErrorMessage = "请输入你的博客名称!")]  public string BlogName { get; set; }  [Display(Name = "博客地址")]  [Required(ErrorMessage = "请输入你的博客地址!")]  public string BlogAddress { get; set; }  [Display(Name = "博客图片")]  [Required(ErrorMessage = "请上传你的博客图片!")]  [ValidateFile]  public HttpPostedFileBase BlogPhoto { get; set; } }

上述未有验证文件的特性,只能自定义文件特性,如下:

 public class ValidateFileAttribute : ValidationAttribute {  public override bool IsValid(object value)  {   int MaxContentLength = 1024 * 1024 * 4;   string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".pdf" };   var file = value as HttpPostedFileBase;   if (file == null)    return false;   else if (!AllowedFileExtensions.Contains(file.FileName.Substring(file.FileName.LastIndexOf('.'))))   {    ErrorMessage = "请上传你的博客图片类型: " + string.Join(", ", AllowedFileExtensions);    return false;   }   else if (file.ContentLength > MaxContentLength)   {    ErrorMessage = "上传图片过大,不能超过4兆 : " + (MaxContentLength / 1024).ToString() + "MB";    return false;   }   else    return true;  } }

我们可以任意设置上传的文件大小,我们设置为40兆,在配置文件中我们知道 maxRequestLength = 4096 默认是4兆,当然我们可以改变其默认设置。


此时我们接着在控制器中修改上述上传的方法:

  [HttpPost]  public ActionResult UploadFile(BlogModel bModel)  {   if (ModelState.IsValid)   {    var fileName = bModel.BlogPhoto.FileName;    var filePath = Server.MapPath(string.Format("~/{0}", "File"));    bModel.BlogPhoto.SaveAs(Path.Combine(filePath, fileName));    ModelState.Clear();   }      return View();  }

我们接下来看看效果:

咋回事,出状况了看来是我们的文件过大的原因,看了下该文件有接近45兆,而我们却设置的是40兆,于是乎继续在配置文件中去修改文件大小,但是结果还是一样。我们继续仔细看看该结果的提示,根据提示去找到配置文件下的节点再试试,我们在 syste.webServer 节点下设置为2G:

          

结果就好使了,查了查也有遇到类似问题的人,貌似只有给个结果,却没有给解释,为什么在 httpRuntime 中设置不行,但是有些这样设置是正确的,这是什么原因?最终找到了答案:

(1)在IIS 5和IIS 6中,默认文件上传的最大为4兆,当上传的文件大小超过4兆时,则会得到错误信息,但是我们通过如下来设置文件大小。

 

(2)在IIS 7中,默认文件上传的最大为28.6兆,当超过其默认设置大小,同样会得到错误信息,但是我们却可以通过如下来设置文件上传大小。

      

【类推的话,个人觉得可能是在IIS 7+以上都是通过如上述IIS 7来设置文件上传大小】

虽然我们在服务器端对其进行验证,但是我们觉得这样还是不能保险,我们继续在客户端对其上传的图片类型和大小进行验证。

(1)利用强类型视图给出视图代码:

  • @Html.LabelFor(m => m.BlogName)
    @Html.TextBoxFor(m => m.BlogName, new { maxlength = 50 }) @Html.ValidationMessageFor(m => m.BlogName)
  • @Html.LabelFor(m => m.BlogAddress)
    @Html.TextBoxFor(m => m.BlogAddress, new { maxlength = 200 }) @Html.ValidationMessageFor(m => m.BlogAddress)
  • @Html.LabelFor(m => m.BlogPhoto) @Html.TextBoxFor(m => m.BlogPhoto, new { type = "file" }) @Html.ValidationMessageFor(m => m.BlogPhoto)

(2)利用脚本获取上传文件大小:

 function GetFileSize(fileid) {  var fileSize = 0;  fileSize = $("#" + fileid)[0].files[0].size;  fileSize = fileSize / 1048576;  return fileSize; }

(3)根据上传的路径获取文件名称:

 function getNameFromPath(strFilepath) {  var objRE = new RegExp(/([^\/\\]+)$/);  var strName = objRE.exec(strFilepath);  if (strName == null) {   return null;  }  else {   return strName[0];  } }

(4)当更换文件时触发Change事件对其文件类型和文件大小进行验证:

  $("#BlogPhoto").change(function () {   var file = getNameFromPath($(this).val());   if (file != null) {    var errors = $(document).find(".field-validation-error");    $.each(errors, function (k, v) {     if ($(v).attr("data-valmsg-for") === "BlogPhoto") {      $(v).hide();     }    });    var extension = file.substr((file.lastIndexOf('.') + 1));    switch (extension) {     case 'jpg':     case 'png':     case 'gif':     case 'pdf':      fileTypeBool = false;      break;     default:      fileTypeBool = true;    }   }   if (fileTypeBool) {    $("#warning").html("只能上传扩展名为jpg,png,gif,pdf的文件!");    return false;   }   else {    var size = GetFileSize('BlogPhoto');    if (size > 4) {     fileSizeBool = true;     $("#warning").html("上传文件已经超过4兆!");    } else {     fileSizeBool = false;    }   }  });

(5)当点击提交按钮时对其进行文件进行验证:

  $("#uploadFileSub").submit(function () {   $("input[type='text']").each(function (k, v) {    if ($(v).length) {     $(v).siblings("span").hide();    }   });   if (fileTypeBool || fileSizeBool) {    return false;   }  });

【注意】上述对于验证不是太完整,但是基本的架子已经给出。

接下来我们来完整的演示整个过程。

上述我们一直是利用的纯HTML代码,当然也可以利用MVC的扩展方法来进行,如下(最终渲染的还是表单,本质上是一致的,就不做过多探讨了)

@using (Html.BeginForm("UploadFile", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })){  }

以上是"ASP.NET MVC如何实现文件上传"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

文件 大小 博客 验证 类型 视图 图片 结果 接下来 名称 还是 配置 最大 一致 代码 信息 内容 原因 后台 地址 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会主任 科技制造互联网公司 科技与互联网发展 朗涯互联网科技 极限挑战互联网科技 云电互联网科技 互联网 视角下的科技创新 上海亿帐通互联网科技 互联网金融科技委员会 互联网公司会议桌创意科技软装饰 互联网科技项目计划书材料类 华中科技大学互联网的牛人 上海京穆互联网科技有限公司 2021互联网科技公司排名 富国互联网金融科技混合基金 银川新华互联网科技学校是国营吗 重庆科技产业互联网有哪些 广东猫王互联网科技有限公司电话 恒生科技互联网指数十大成分股 互联网 科技节活动 微视频大赛 互联网科技工作委员会主任 互联网与科技金融数据 智慧科技互联网 蓝色互联网科技 北京三清互联网科技 科技互联网海报 广西科技产业互联网是什么 好易买互联网科技 第三届互联网大会安防黑科技 宁波允成互联网科技有限公司
0