• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET MVC 文件上传教程(一)

ASP.NET MVC 文件上传教程(一)

作者:Recluse_Xpy 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Recluse_Xpy通过本文主要向大家介绍了asp net mvc,asp net mvc 4,asp net mvc 5,精通asp.net mvc 5,精通asp.net mvc 4等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

这一节我们来讲讲在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();
  }

</div>

在 UploadFile 视图中添加上如下:

<form action="/Home/UploadFile" method="post" enctype="multipart/form-data">
 <input type="file" name="file" /><br />
 <input type="submit" value="提交" />
</form>
</div>

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

(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; }
 }

</div>

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

 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;
  }
 }

</div>

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

<httpRuntime targetFramework="4.5" executionTimeout="1100"  maxRequestLength="40960" />
此时我们接着在控制器中修改上述上传的方法: 

  [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();
  }
</div>

我们接下来看看效果:

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

 <security>
  <requestFiltering>
  <requestLimits maxAllowedContentLength="2147483647">
  </requestLimits>
  </requestFiltering>
 </security>
</div>

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

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

<system.web>
 <httpRuntime maxRequestLength="2147483647" executionTimeout="100000" />
</system.web>
</div>

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

<system.webServer>
 <security>
 <requestFiltering>
  <requestLimits maxAllowedContentLength="2147483647" />
 </requestFiltering>
 </security>
</system.webServer>
</div>

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

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

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

<style type="text/css">
 .field-validation-error {
  color: red;
 }
</style>
<form id="uploadFileSub" action="/Home/UploadFile" method="post" enctype="multipart/form-data">
 <fieldset>
  <legend></legend>
  <ul class="lifile">
   <li>
    @Html.LabelFor(m => m.BlogName)<br />
    @Html.TextBoxFor(m => m.BlogName, new { maxlength = 50 })
    @Html.ValidationMessageFor(m => m.BlogName)
   </li>
   <li>
    @Html.LabelFor(m => m.BlogAddress)<br />
    @Html.TextBoxFor(m => m.BlogAddress, new { maxlength = 200 })
    @Html.ValidationMessageFor(m => m.BlogAddress)<br />
   </li>
   <li>
    @Html.LabelFor(m => m.BlogPhoto)
    @Html.TextBoxFor(m => m.BlogPhoto, new { type = "file" })
    @Html.ValidationMessageFor(m => m.BlogPhoto)
    <span id="warning" style="color:red;font-size:large;"></span>
   </li>
   <li>
    <input type="submit" value="提交" />
   </li>
  </ul>

 </fieldset>
</form>

</div>

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

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

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

 function getNameFromPath(strFilepath) {
  var objRE = new RegExp(/([^\/\\]+)$/);
  var strName = objRE.exec(strFilepath);

  if (strName == null) {
   return null;
  }
  else {
   return strName[0];
  }
 }

</div>

(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();
     }
    



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET MVC从视图传参到控制器的几种形式
  • ASP.NET MVC 4 中的JSON数据交互的方法
  • ASP.NET MVC制作404跳转实例(非302和200)
  • 详解ASP.NET MVC 利用Razor引擎生成静态页
  • 详解ASP.NET MVC 解析模板生成静态页(RazorEngine)
  • ASP.NET MVC4 利用uploadify.js多文件上传
  • ASP.NET mvc4中的过滤器的使用
  • Asp.net MVC下使用Bundle合并、压缩js与css文件详解
  • 详解Asp.Net MVC——控制器与动作(Controller And Action)

相关文章

  • 2017-05-11ASP.NET样板项目ABP框架的特性总结
  • 2017-05-11扩展方法ToJSON() and ParseJSON()
  • 2017-05-11ASP.NET MVC HtmlHelper如何扩展
  • 2018-08-20Asp.Net Core轻量级Aop解决方案:AspectCore
  • 2017-05-11asp.net BackgroundWorker之在后台下载文件
  • 2017-05-11upload上传单张图片
  • 2017-05-11详解ASP.NET Core 之 Identity 入门(二)
  • 2017-05-11仿vs实现WPF好看的进度条
  • 2017-05-11.net 反序题目的详细解答第1/2页
  • 2017-05-11ASP.NET数据绑定之DataList控件实战篇

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • asp.net Timer的使用方法
    • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
    • asp.net(C#) 生成随机验证码的代码
    • .net 页面指定区域打印的方法
    • .net 获取浏览器Cookie(包括HttpOnly)实例分享
    • .NET 常用功能和代码小结
    • 动态组合SQL语句方式实现批量更新的实例
    • 合并两个DataSet的数据内容的方法
    • asp.net字符串分割函数使用方法分享
    • asp.net(C#)把汉字转化成全拼音函数(全拼)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有