• 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

上文ASP.NET MVC 文件上传教程(一)我们讲了简单的上传以及需要注意的地方,查相关资料时,感觉上传里面涉及到的内容还是比较多,于是就将上传这一块分为几节来处理,同时后续也会讲到关于做上传时遗漏的C#应该注意的地方,及时进行查漏补缺,尽量将这一块完善起来。

引入
上一节我们讲到了上传这一块,有朋友提出未涉及到大文件的上传这一块,思前想后还是来试着做做,毕竟之前没怎么去仔细考虑过这个问题,尤其还可以联系实际开发中创建文件夹等一系列问题,同时关于上传在网上随便找找都充斥着大量的组件,我们何必再去造轮子,我需要做的是只是对基础的回顾以及进一步深入以及在做的过程中发现一些细节性的问题并解决就足矣,不喜勿喷。

深入上传
再次声明对于上传可以显示上传进度之类我们不去做过多探讨,有这样的组件,自行去找,我们只需实现比较核心的这一块即可。

我们可以想象这一样一个场景:比如在博客园中,每个博客者都可以上传文件如图片、脚本之类,我们可以通过园友名称来创建每个园友上传的文件,接下来我们来实现这样的一个场景。

既然是对应博客的名称创建文件,也就是需要对应的博客这样的一个类。如下:

 public class BlogSample
 {
  public string UserName { get; set; }

  public string Id { get; set; }
 }

</div>

我们通过博客名称来创建文件夹并在该文件夹下以唯一的Id来创建子文件夹,在该Id文件夹下的附件( atttachment )中存储上传的文件。接下来我们需要梳理整个上传文件的过程。难道就把要上传的文件直接到上传到对应的文件夹吗,这么做显然不是最优的,当有上传中断时则在文件夹创建的文件不是完整的则是垃圾文件,而我们直接先创建一个临时文件,即使上传失败我们可以定期清理临时文件也就是垃圾文件,若未中断,上传完毕时则将临时文件移动到我们对应的文件夹中。通过我们实际下载文件时很明显看的出也是这么做的。接下来我们开始进行实现。

(1)我们给出一个关于上传的 UploadManager 静态类,我们可以写死上传的文件夹名称或者通过配置文件自定义上传文件夹名称。

  static UploadManager()
  {
   //从配置文件中获取上传文件夹
   if (String.IsNullOrWhiteSpace(WebConfigurationManager.AppSettings["UploadFolder"]))
    UploadFolderRelativePath = @"~/upload";
   else
    UploadFolderRelativePath = WebConfigurationManager.AppSettings["UploadFolder"];

   UploadFolderPhysicalPath = HostingEnvironment.MapPath(UploadFolderRelativePath);

   if (!Directory.Exists(UploadFolderPhysicalPath))
    Directory.CreateDirectory(UploadFolderPhysicalPath);
  }

</div>

上述已经表明可以自定义上传文件夹在配置文件中(给出上传虚拟路径),例如如下:

  <!--<add key="UploadFolder" value="~/UploadFile/">-->

(2)保存文件的核心方法

  [SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
  public static bool SaveFile(Stream stream, string fileName, string userName, string guid)
  {
   string tempPath = string.Empty, targetPath = string.Empty;

   try
   {
    string tempFileName = GetTempFilePath(fileName);

    if (userName != null)
    {
     var contentType = userName;
     var contentId = guid;

     tempPath = GetTempFilePath(tempFileName);
     targetPath = GetTargetFilePath(fileName, contentType, contentId, string.Empty, FilesSubdir);


     //若上传文件夹中子文件夹未存在则创建
     var file = new FileInfo(targetPath);
     if (file.Directory != null && !file.Directory.Exists)
      file.Directory.Create();

     using (FileStream fs = File.Open(tempPath, FileMode.Append))
     {
      if (stream.Length > 0)
      {
       SaveFile(stream, fs);
      }
      fs.Close();
     }
     //上传完毕将临时文件移动到目标文件
     File.Move(tempPath, targetPath);
    }
   }
   catch (Exception)
   {
    // 若上传出错,则删除上传到文件夹文件
    if (File.Exists(targetPath))
     File.Delete(targetPath);

    // 删除临时文件
    if (File.Exists(tempPath))
     File.Delete(tempPath);

    return false;
   }
   finally
   {
    // 删除临时文件
    if (File.Exists(tempPath))
     File.Delete(tempPath);
   }
   return true;
  }

</div>

(3)循环读取流到文件流中

   /// <summary>
  /// 循环读取流到文件流中
  /// </summary>
  /// <param name="stream"></param>
  /// <param name="fs"></param>
  public static void SaveFile(Stream stream, FileStream fs)
  {
   var buffer = new byte[4096];
   int bytesRead;
   while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
   {
    fs.Write(buffer, 0, bytesRead);
   }
  }
</div>

(4)开始写入测试数据,进行调用方法:

   var testSample = new BlogSample() { UserName = "xpy0928", Id = Guid.NewGuid().ToString("N") };
   if (ModelState.IsValid)
   {
    var fileName = bModel.BlogPhoto.FileName;
    var success = UploadManager.SaveFile(bModel.BlogPhoto.InputStream, fileName, testSample.UserName, testSample.Id);
    if (!success)
    {
     // TODO(your code)
    }
    //var filePath = Server.MapPath(string.Format("~/{0}", "File"));
    //bModel.BlogPhoto.SaveAs(Path.Combine(filePath, fileName));
    ModelState.Clear();
   }
</div>

接下来我们来进行测试,通过上传一个84M的文件来看看效果(稍等片刻,文件有点大)。

不好意思,令我大失所望,和昨天出现的错误不一样,今天出错是:超过最大请求长度。我们接下来再来看看昨天所说,我的IIS为10.0,也就是在IIS 7+上,通过昨天那样设置应该是没问题的,难道和另外一个设置有关吗,我们看看配置文件中的配置。

<httpRuntime targetFramework="4.5"/>
未进行设置,超过其默认设置28.6M就出错了吗,我们再设置为2G看看。

<httpRuntime targetFramework="4.5" executionTimeout="1100"  maxRequestLength="2147483647"/>


好,上传成功也未出现上述错误。

结语
这一节我们讲了一下利用流来进行大文件的处理,不过还是出现了一点小问题,和昨天再一起做一次总结:

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

关于在配置文件中如何设置文件大小而不出错,总算做了一个最终的总结,有收获,继续Fighting。
本文作者:

分享到: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 Timer的使用方法
  • 2017-05-11asp.net读取excel中的数据并绑定在gridview
  • 2017-05-11在asp.net(C#)中采用自定义标签和XML、XSL显示数据
  • 2017-05-11asp.net 细说文件读写操作(读写锁)
  • 2017-05-11详解ABP框架中领域层的领域事件Domain events
  • 2017-05-11asp.net 类库中使用ConfigurationManager.ConnectionStrings
  • 2017-05-11浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能
  • 2017-05-11Repeater的FooterTemplate显示某列总计思路与代码
  • 2017-05-11ASP.NET的广告控件AdRotator用法分析
  • 2017-05-11网页WEB打印控件制作

文章分类

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

最近更新的内容

    • Visual Studio 2013+OpenCV2.4.10环境搭建教程
    • 浅谈.Net并行计算之数据并行
    • asp.net mvc发送邮件实例讲解
    • ASP.NET服务器端控件RadioButtonList,DropDownList,CheckBoxList的取值、赋值用法
    • ASP.NET 重定向的几种方法小结
    • 扩展了Repeater控件的EmptyDataTemplate模板功能
    • 在Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)
    • asp.net 生成缩略图代码
    • .NET微信公众号开发之公众号消息处理
    • Asp.net动态生成html页面的方法分享

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

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