MVC文件保存
开发工具与关键技术:
作者:熊琪
撰写时间:2019.05.01
一般我们会把文件保存到文件夹里面:这里我们在做发布公告的时候会创建几个文件夹,如下: Temp 临时文件夹(上传的文件,在这里临时保存)
Notice 最终文件夹: Attachment附件, Image:富文本编辑器图片; NoticeCarousel 轮播图片; Text:富文本编辑器内容;
想要上传一张图片到ckeditor富文本编辑器首先得确定一下图片的类型;代码写法:string fileExtension = Path.GetExtension(upload.FileName);
flieExtension是用来接收获取的文件后缀的参数,Path.GetExtension是引用了IO流的获取文件后缀名的方法,括号中upIoad代表的是文件,FlieName文件名称;整的一句代码意思就是提取文件名称用IO流的方法来或取后缀,最后给个参数接收。(后缀比如.txt,.image)。获取后缀之后再进行一个判断,判断是否是图片的后缀,先将后缀的大小写统一设定为小写,然后开始判断用转化过后的扩展名是否是图片类型中的一种,然后保存图片,给需要保存的图片一个路径,保存到自己封装的类ckeditor4UploadResult中,代码图:
因为直接上传的图片是找不到路径的所以需要我们自己拼接一部分,uploaded默认上传,fileName,文件名称,url上传文件的URL(URL编码)代码图:
当我们把相同的图片保存到文件夹中就很容易发生冲突,所以就需要重写文件名称,因为时间是不会重复的,代码:
string fileName = DateTime.Now.ToString(“yyyy-MM-dd”) + “-” + Guid.NewGuid() + fileExtension;
拓展,在文件夹中保存文件,要把文件唯一化。名称唯一化了也就唯一化了,命名时有很多方法,比如这里用时间来拼接Guid,(什么是Guid,Guid全名为GIobally Unique Identifier 叫做全球唯一标识符,也可称作UUID(Universally Unique IDentifier )。GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性。GUID主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在Windows平台上、GUID广泛应用于微软的产品中、用于标识如注册表项、类及接口标识号、数据库、系统目录等对象。格式也有多种,其中的字符都是由0-9,或a-f,范围内的一个32位进制数构成的。
因为在富文本编辑器中选中图片后没有点击保存但也需要显示在了编辑器中,或点击了推返回按钮 ,所以在这里我们是将文件暂时的保存在一个文件夹当中,然后你得判断文件路径在没在,当没在时就创建,也可以自己直接手动创建,代码图:
写好函数后就可以实现富文本上传的作用,但调用的方法比较特殊,调用时在config.js的一个JS插件当中调用,调用代码写法:
config.filebrowserImageUploadUrl = ‘/SystemManagements/IssuanceNotice/UpEditorFile’;直接接方法的路经。因为他是一个JS文件所以怕页面反应不过来,我们可以先重新生成一下项目,如图:
重新生成完项目后启动,如果页面的效果还是没出来那么先刷新页面清楚页面缓存的数据,这样就可以实现富文本选择器当众图片的临时保存效果图:
前面代码所写的保存路径:/Document/Temp/要么手动创建,要么代码创建。这样问富文编辑器的图片上传就算完成了。
接下来是富文本中添加附件的操作,首先写入上传附件方法,一般有关文件的接收都用HttpPostedFileBase来接收,这里上传的文件名称为attachmentFile首先判断上传的文件的长度是大于0的,提示文件上传的大小不能大于20M,因为在选中文件后只要没有最终的上传的文件都将保存在临时的文件夹中,首先检查文件夹是否存在不存在就创建
if(!Directory.Exists(Server.MapPath("~/Document/Temp/")))
{Directory.CreateDirectory(Server.MapPath("~/Document/Temp/"));
}与之前的图片上传保存的临时文件夹相同,为防止保存的名称相同所以需要添加时间字符串重新命名,然后保存文件保存的路径。判断保存的文件属于什么类型,有视频,音频,文本,文档,图片和其它,手动给文件类型的ID与数据库相同。需要保存每一条文件所以需要实例化一个实体然后给每一个实体赋值在给文件一个个a标签顺便拼接一个现在的插件,代码如图:
因为传递到页面的数据大于数据库文件表中的字段,所以我们需要用实体类来接收获取文件表代码图:
如果当Session[“sessionFiles”]没有值时不做处理,有值时把值赋值于我们的文件表sessionFiles中,最后更新session,代码图: