写在前面

本篇文章将新建文件夹的逻辑也进行一下修改。

系列文章

[EF]vs15+ef6+mysql code first方式

[实战]MVC5+EF6+MySql企业网盘实战(1)

[实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

[实战]MVC5+EF6+MySql企业网盘实战(3)——验证码

[实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

[Bootstrap]modal弹出框

[实战]MVC5+EF6+MySql企业网盘实战(5)——登录界面,头像等比例压缩

[实战]MVC5+EF6+MySql企业网盘实战(5)——页面模板

[实战]MVC5+EF6+MySql企业网盘实战(5)——ajax方式注册

[实战]MVC5+EF6+MySql企业网盘实战(6)——ajax方式登录

[实战]MVC5+EF6+MySql企业网盘实战(7)——文件上传

[实战]MVC5+EF6+MySql企业网盘实战(8)——文件下载、删除

[实战]MVC5+EF6+MySql企业网盘实战(9)——编辑文件名

[实战]MVC5+EF6+MySql企业网盘实战(10)——新建文件夹

[实战]MVC5+EF6+MySql企业网盘实战(11)——新建文件夹2

[实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件

[实战]MVC5+EF6+MySql企业网盘实战(13)——编辑文件夹

[实战]MVC5+EF6+MySql企业网盘实战(14)——逻辑重构

[实战]MVC5+EF6+MySql企业网盘实战(15)——逻辑重构2

[实战]MVC5+EF6+MySql企业网盘实战(16)——逻辑重构3

新建文件夹

前面对网盘的逻辑进行了一下重构,发现越来越简单了。

  public JsonResult CreateFolder(){UserInfo userInfo = Session["user"] as UserInfo;if (userInfo == null){RedirectToAction("Login", "UserInfo");}string folderPath = Server.UrlDecode(Request.Params["folderPath"]);string folderName = Request.Params["folderName"];if (string.IsNullOrEmpty(folderName)){throw new ArgumentNullException("文件夹名称不能为空");}//检查文件夹是否已经存在Expression<Func<MyFile, bool>> where = null;if (string.IsNullOrEmpty(folderPath)){where = x => x.User.Id == userInfo.Id && x.IsFolder == 1 && x.IsDelete == false && x.FolderPath == "/NetDisk/";}else{where = x => x.User.Id == userInfo.Id && x.IsFolder == 1 && x.IsDelete == false && x.FolderPath == folderPath;}var count = _myFileServiceRepository.FindAll(where).Count();userInfo = _userInfoServiceRepository.Find(x => x.Id == userInfo.Id);if (count > 0){//如果不存在,则新建,否则进行自动重命名folderName = folderName + "(" + (count + 1).ToString() + ")";}if (string.IsNullOrEmpty(folderPath)){folderPath = "/NetDisk/";}MyFile folder = new MyFile(){FolderPath = folderPath.TrimEnd('/') + "/",FileName = folderName,CreateDt = DateTime.Now,User = userInfo,FileExt = string.Empty,FileIcon = "/Content/Images/FolderType.png",FileMd5 = string.Empty,FileSize = 0,IsDelete = false,ModifyDt = DateTime.Now,IsFolder = 1};try{_myFileServiceRepository.Add(folder);_myFileServiceRepository.SaveChanges();}catch (Exception){return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 500, msg = "创建失败" }) };}return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 200, folder = folder }) };}

上传文件的地方需要修改一下,对文件的路径中存在中文会出现乱码的情况,做一下修改。

        [HttpPost]public void UploadFile(string filePath){UserInfo userInfo = Session["user"] as UserInfo;//保证路径格式一直以/结束filePath = filePath.TrimEnd('/') + "/";if (userInfo == null){RedirectToAction("Login", "UserInfo");}filePath = Server.UrlDecode(filePath == "/" ? "/NetDisk/" : filePath);var files = Request.Files;MyFile myFile = null;if (files.Count > 0){var file = files[0];string fileName = file.FileName;Stream inputStream = file.InputStream;string fileSaveFolder = Server.MapPath("~/NetDisk");//如果目标不存在,则创建if (!Directory.Exists(fileSaveFolder)){Directory.CreateDirectory(fileSaveFolder);}byte[] buffer = new byte[inputStream.Length];//判断是否已经超出个人网盘大小var myFiles = _myFileServiceRepository.FindAll(x => x.User.Id == userInfo.Id && x.IsDelete == false);int myDiskSize = 0;if (myFiles.Count() > 0){myDiskSize = myFiles.Sum(x => x.FileSize);}//如果已经超出网盘大小,则给出提示if (myDiskSize + buffer.Length > userInfo.NetDiskSize){AlertMsg("对不起,您的网盘空间不足,请清理后再次上传,或联系管理员进行扩容。", "");return;}inputStream.Read(buffer, 0, buffer.Length);string strFileMd5 = MD5Helper.GetMD5FromFile(buffer);string fileSavePath = Path.Combine(fileSaveFolder, filePath);//名称格式一律以md5命名。string strNewName = strFileMd5 + Path.GetExtension(file.FileName);fileSavePath = Path.Combine(fileSaveFolder, strNewName);//如果文件不存在,则保存物理文件。if (!System.IO.File.Exists(fileSavePath)){file.SaveAs(fileSavePath);}//判断在数据库中同一路径下,md5相同,名称相同的文件是否存在,不存在则直接插入,否则对文件进行自动重命名保存。var fileIsExist = _myFileServiceRepository.Find(x => x.FileMd5 == strFileMd5 && x.User.Id == userInfo.Id && x.FileName == fileName);//如果找到的文件对象不为空,并且是删除状态,则修改删除状态,不再新增文件信息,否则添加。//查询导航属性var currentUser = _userInfoServiceRepository.Find(x => x.Id == userInfo.Id);if (fileIsExist != null){myFile = fileIsExist;//文件被逻辑删除了,则更新状态,否则重命名后新增文件。if (fileIsExist.IsDelete){fileIsExist.IsDelete = false;_myFileServiceRepository.Update(fileIsExist);}else{//查找该用户下类似文件名的文件并且没有被逻辑删除的个数var count = _myFileServiceRepository.FindAll(x => x.User.Id == userInfo.Id && x.IsDelete == false && x.FileName.Contains(fileName)).Count();fileName = count > 0 ? Path.GetFileNameWithoutExtension(fileName) + "(" + (count + 1).ToString() + ")" + Path.GetExtension(fileName) : fileName;myFile = new MyFile(){FileMd5 = strFileMd5,ModifyDt = DateTime.Now,IsDelete = false,FileSize = buffer.Length,FolderPath = filePath,FileExt = Path.GetExtension(fileSavePath),CreateDt = DateTime.Now,FileName = fileName,FileIcon = GetFileIcon(Path.GetExtension(fileSavePath)),User = currentUser,IsFolder = 0};//保存数据库
                        _myFileServiceRepository.Add(myFile);}}else{//新增文件信息myFile = new MyFile(){FileMd5 = strFileMd5,ModifyDt = DateTime.Now,IsDelete = false,FileSize = buffer.Length,FolderPath = filePath,FileExt = Path.GetExtension(fileSavePath),CreateDt = DateTime.Now,FileName = fileName,FileIcon = GetFileIcon(Path.GetExtension(fileSavePath)),User = currentUser,IsFolder = 0};//保存数据库
                    _myFileServiceRepository.Add(myFile);}_myFileServiceRepository.SaveChanges();string json = new JavaScriptSerializer().Serialize(myFile);AlertMsg("上传成功", json);}}

UploadFile

总结

今天练完车在路上好好想了一下,发现按照这个思路走下去,网盘功能实现起来更简单一些。

转载于:https://www.cnblogs.com/wolf-sun/p/4986326.html

[实战]MVC5+EF6+MySql企业网盘实战(16)——逻辑重构3相关推荐

  1. [实战]MVC5+EF6+MySql企业网盘实战(24)——视频列表

    写在前面 上篇文章实现了文档列表,所以实现视频列表就依葫芦画瓢就行了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(15)——逻辑重构2

    写在前面 上篇文章修改文件上传的逻辑,这篇修改下文件下载的逻辑. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实 ...

  3. mvc5 ef6 mysql_[实战]MVC5+EF6+MySql企业网盘实战(17)——思考2

    写在前面 今天吃饭回来,突然有一个更好的想法,这里做一下记录. 系列文章 [实战]MVC5+EF6+MySql企业网盘实战(17)--思考2 思路 平时如果要获取电脑上的文件,大都会采用递归的方式,所 ...

  4. [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

    写在前面 上篇文章简单介绍了项目的结构,这篇文章将实现用户的注册.当然关于漂亮的ui,这在追后再去添加了,先将功能实现.也许代码中有不合适的地方,也只有在之后慢慢去优化了. 系列文章 [EF]vs15 ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件

    写在前面 之前的上传文件的功能,只能上传到根目录,前两篇文章实现了新建文件夹的功能,则这里对上传文件的功能进行适配. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战] ...

  6. 上传头像mysql_上传头像 - MVC5+EF6+MySql企业网盘实战 - 爱整理

    写在前面 最近又开始忙了,工期紧比较赶,另外明天又要去驾校,只能一个功能一个功能的添加了,也许每次完成的功能确实不算什么,等将功能都实现了,然后在找一个好点的ui对前端重构一下. 示例 这里采用最简单 ...

  7. SQL注入实战————1、MySQL手工注入实战

    无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,小白也能学,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 日程管理   http:// ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统

    ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...) 开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联 ...

最新文章

  1. mkfs.ext4 /dev/sdb 与 mkfs.ext4 /dev/sdb1
  2. 塔利亚菲科 ajax,[欧冠小组赛第4轮]阿贾克斯 3-1 中日德兰
  3. note deletion case
  4. php 直播服务器搭建,基于Nginx搭建RTMP/HLS视频直播服务器
  5. [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组]
  6. PHP19 PHPStorm2018和GitHub的使用
  7. Eclipse启动报错:A java runtime Environment(JRE) or java Development……的解决办法
  8. Antlr中文文档初稿5(《ANTLR记号流》)
  9. 小D课堂 - 新版本微服务springcloud+Docker教程_5-06 高级篇幅之深入源码
  10. vue上传图片时,console.log()图片信息遇到的坑
  11. SharedCache-共享缓存概况和初步运用实例(1)
  12. MATLAB绘制垂直正态分布密度曲线
  13. 转正述职报告怎么写?五年经验PM告诉你……
  14. 【计量经济学】工具变量估计与两阶段最小二乘法
  15. 恩,今天把git和sublime结合了一下。。然后看了下《西部世界》
  16. 服务器维护简单的备份方案,几种常见的数据备份方案分享
  17. Soul向港交所递交上市申请,持续发力社交元宇宙赛道
  18. 医疗器械软件 软件生存周期过程
  19. 网络流的各种加边优化
  20. 55个经典开源Windows工具

热门文章

  1. 智能机器人与系统高精尖创新中心2018年度开放基金项目申报通知
  2. 致开发者:2018年AI技术趋势展望
  3. 隐藏十年竟无人发现!Sudo 漏洞被曝出:无需密码就能获取 root 权限
  4. 为什么苹果 M1 芯片如此之快?
  5. “地理智慧 链接未来”,2020 GIS 软件技术大会主题大会召开
  6. 引入Redis|tensorflow实现 聊天AI--PigPig养成记(3)
  7. JavaScript之Promise实现
  8. shell 执行 oracle sql
  9. 《高性能科学与工程计算》——3.7 习题
  10. Kupu,“document-centric”的开放源码的客户端文本编辑器