附件上传
开发工具与关键技术:Visual Studio 2015 、附件上传
作者:袁何恩
撰写时间:2019年5月27日
今天,我要和大家分享的技术是附件上传。
附件上传是数据的直接上传,不用转换类型。但是有两点要记住和注意的,第一点是js直接上传文件,多于20M很容易报错;第二点在你没有点击保存的时候,附件是不能保存到数据库的,需要用Session来暂时储存它。
一、在视图上写上附件上传的方法,这方法要限制文件上传的大小,先分别new一个FormData对象和XMLHttpRequest对象,再将第一个文件放入FormData,写上控制器上相应的方法的路径,代码图如下:
三、 在控制器中写上附件上传的方法。
1、首先,用attachmentFile来接收页面传来的数据,来获取上载文件的大小(以字节为单位)。检查目录是否存在,不存在就创建,改变文件名称,添加时间字符串,避免文件名称相同,不包含文件扩展名的名称,写上保存文件的路径和文件保存的格式,代码图如下:
上图中为什么要限制文件上的大小不能大于20M呢?因为js直接上传文件,多于20M很容易报错。需要断点续传,所以一般上传小于20M的文件,如果一定要上传特别大的文件的话,一定要用到第三方的插件,而像正常的这种,默认是不支持断点续传的,上传大文件很容易中断。
图中ContentLength是在派生类中重写时,获取上载文件的大小(以字节为单位),HttpPostedFileBase是充当类的基类,这些类提供对客户端已上载的单独文件的访问 ,List是初始化List类的新实例,该实例为空并且具有默认初始容量 ,List是表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法, Directory是公开用于创建、移动和枚举通过和子目录的静态方法。此类不能被继承。Exists是确定给定路径是否引用磁盘上的现有目录,MapPath是在派生类重写时,返回与Web服务器上的指定虚拟路径相对应的物理文件路径,CreateDirectory是在指定路径创建所有目录和子目。
2、接下来就是限制文件上传的类型,fileExtension来接收文件的后缀名,再拿它来判断,判断它的后缀名是否相应的后缀名,如果后缀名与控制器中写的后缀名不相同,就不上传它,代码图如下:
这里有一个问题,它是上传的附件,一般来说,在你没有点击保存的时候,是不能保存到数据库的,因为它属于某个数据的附加数据,也就是附件,某个数据都没有点击保存,某个数据的附加数据(附件)就不能保存到数据库,没保存到数据库,你又要进行表格的查询,你就要找一个容器把它保存起来,而在这种网页当中最好的容器是Session。所以在上传附件之前,要在Session列表中查询一下,看这个数据是否以前上传过,如果有把它转换出来,如果没有它就是一个新的附件、空的数据,Session[“sessionFiles”]是一个大容器,list是Session[“sessionFiles”]里的小容器,把数据放进list里,再把list放进Session [“sessionFiles”]里。
图中Contains是放回一个值,该值指示指定的字串是否出现在此字符串中。
3、但是这里上传文件大于4M,还是会出错的,为什么呢?因为ASP.NET.MVC默认上传4M左右,超过4M就上传失败,这是默认的配置。在项目列表里,打开Web.config,这里的配置可以更改,代码图如下:
附件上传
版权声明:本文为weixin_44561769原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。