前言

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

引入

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

深入上传

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

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

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

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

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

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

        static UploadManager(){//从配置文件中获取上传文件夹if (String.IsNullOrWhiteSpace(WebConfigurationManager.AppSettings["UploadFolder"]))UploadFolderRelativePath = @"~/upload";elseUploadFolderRelativePath = WebConfigurationManager.AppSettings["UploadFolder"];UploadFolderPhysicalPath = HostingEnvironment.MapPath(UploadFolderRelativePath);if (!Directory.Exists(UploadFolderPhysicalPath))Directory.CreateDirectory(UploadFolderPhysicalPath);}

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

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

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

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

接下来我们来进行测试,通过上传一个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>

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

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

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

ASP.NET MVC之文件上传【二】(九)相关推荐

  1. ASP.NET MVC之文件上传【一】(八)

    这一节我们来讲讲在MVC中如何进行文件的上传,我们逐步深入,一起来看看. Upload File(一) 我们在默认创建的项目中的Home控制器下添加如下: public ActionResult Up ...

  2. ASP.NET MVC大文件上传GB级

    后台合并文件时,解决了并发合并冲突异常的情况.测试了2G文件上传,测试了4G文件上传,测试了8G文件上传,都成功了 前端代码方式一 <script src="~/Scripts/jqu ...

  3. ASP.NET MVC图片文件上传与下载

    说明: 前后端代码中均只用到 ASP.NET MVC原生的技术,不需要用到ajax,WebAPI等. 下篇文章[ jQuery + Ajax + WebAPI 上传文件]会介绍使用Ajax POST来 ...

  4. Mr.张小白(案例:基于Spring MVC实现文件上传和下载)

    基于Spring MVC实现文件上传和下载 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&quo ...

  5. iOS开发之结合asp.net webservice实现文件上传下载

    iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下使用asp.net webservice实现文件上传下载. 首先,让我们看下文件下载. 这里我们下载cnblogs上的一个zip文件.使用N ...

  6. 【代码审计-2】PHP框架MVC类文件上传断点测试挖掘

    1.文件上传漏洞挖掘: (1)关键字搜索(函数.键字.全局变量等):比如$_FILES,move_uploades_file等 (2)应该功能抓包:寻找任何可能存在上传的应用功能点,比如前台会员中心, ...

  7. WEB攻防-通用漏洞文件上传二次渲染.htaccess变异免杀

    目录 知识点 详细点 文件二次渲染 php删除规则 例题 CTF-Web入门-162 CTF-Web入门-163 CTF-Web入门-164 CTF-Web入门-165 CTF-Web入门-166 C ...

  8. 【Spring MVC】文件上传、文件下载

    页面效果: 一.文件下载 1.访问资源时相应头如果没有设置 Content-Disposition,浏览器默认按照 inline 值进行处理 1.1 inline 能显示就显示,不能显示就下载. 2. ...

  9. Spring MVC的文件上传和下载以及拦截器

    一.文件上传 在使用form表单进行文件上传时,必须将method设置为 post,并将enctype设置为multipart/form-data.只有这样设置,浏览器才会将需要上传的文件已二进制数据 ...

  10. Vue + Element+ ASP.NET Core WebAPI 文件上传下载

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备asp.net后端文件上传的API Uplo ...

最新文章

  1. php中的css样式改变无反应,解决ecshop清除缓存css样式没反应问题
  2. 【读书笔记《Bootstrap 实战》】3.优化站点资源、完成响应式图片、让传送带支持手势...
  3. Netdata---Linux系统性能实时监控平台部署记录
  4. 多线程解决rospy.spin()语句之后,程序不再往下执行问题
  5. Flutter开发Flutter与原生OC、Java的交互通信-1(47)
  6. 关于寻路算法的一些思考(3):A*算法的实现
  7. mysql如何输出一句话_MySQL/ACCESS导出一句话拿WebShell后门命令
  8. 关于字符集和字符编码格式
  9. c++反向输出一个三位数
  10. U3D常用介绍,搭建一个简单的三维效果
  11. JavaScript对象 、堆与栈
  12. pvs-stdio ue4_PVS-Studio –用于C,C ++,C#和Java的静态代码分析器
  13. 35岁技术人如何转型做管理?mysql删除数据语句
  14. Codeforces 1146G Zoning Restrictions
  15. 最经典最常用的Ecplise快捷键
  16. HDU 6656 Kejin Player(期望)
  17. 我胡汉三回来了!!!
  18. 记录本地 Docker 新建镜像,推送到Daocloud
  19. 游戏平台,游戏私服选择三方支付的优势
  20. Verilog 非阻塞赋值的仿真/综合问题

热门文章

  1. Oracle数户库、表导入导出
  2. IntelliJ IDEA 打包Maven 构建的 Java 项目
  3. P2420 让我们异或吧 (树链剖分,异或前缀和)
  4. Python_爬虫_urllib解析库
  5. Android.mk入门(一)
  6. 跳表 skipList
  7. centreon-engine 性能调优
  8. Failed to load VMMR0.r0 (VERR_SUPLIB_OWNER_NOT_ROOT)
  9. caffe源代码分析--math_functions.cu代码研究
  10. java替代重定向_一个简单的java重定向程序,为什么要恢复System . out 对象,却不要恢复System...