写在前面

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

系列文章

[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 == && x.IsDelete == false && x.FolderPath == "/NetDisk/";
}
else
{
where = x => x.User.Id == userInfo.Id && x.IsFolder == && x.IsDelete == false && x.FolderPath == folderPath;
}
var count = _myFileServiceRepository.FindAll(where).Count();
userInfo = _userInfoServiceRepository.Find(x => x.Id == userInfo.Id);
if (count > )
{
//如果不存在,则新建,否则进行自动重命名
folderName = folderName + "(" + (count + ).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 = ,
IsDelete = false,
ModifyDt = DateTime.Now,
IsFolder =
};
try
{
_myFileServiceRepository.Add(folder);
_myFileServiceRepository.SaveChanges();
}
catch (Exception)
{
return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = , msg = "创建失败" }) };
}
return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = , 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 > )
{
var file = files[];
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 = ;
if (myFiles.Count() > )
{
myDiskSize = myFiles.Sum(x => x.FileSize);
}
//如果已经超出网盘大小,则给出提示
if (myDiskSize + buffer.Length > userInfo.NetDiskSize)
{
AlertMsg("对不起,您的网盘空间不足,请清理后再次上传,或联系管理员进行扩容。", "");
return;
}
inputStream.Read(buffer, , 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 > ? Path.GetFileNameWithoutExtension(fileName) + "(" + (count + ).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 =
};
//保存数据库
_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 =
};
//保存数据库
_myFileServiceRepository.Add(myFile);
}
_myFileServiceRepository.SaveChanges();
string json = new JavaScriptSerializer().Serialize(myFile);
AlertMsg("上传成功", json);
}
}

UploadFile

总结

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

[实战]MVC5+EF6+MySql企业网盘实战(16)——逻辑重构3的更多相关文章

  1. [实战]MVC5+EF6+MySql企业网盘实战(28)——其他列表

    写在前面 本篇文章将实现,其他文件类型的列表. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5+EF ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(27)——应用列表

    写在前面 本篇文章将实现应用列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘 ...

  3. [实战]MVC5+EF6+MySql企业网盘实战(26)——音乐列表

    写在前面 本篇文章将实现,音乐列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网 ...

  4. [实战]MVC5+EF6+MySql企业网盘实战(25)——种子列表

    写在前面 上篇文章实现了视频列表,本篇文章继续实现其他的文件列表.功能相似.这里就不再赘述. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MyS ...

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

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

  6. [实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表

    写在前面 上篇文章实现了图片列表,这篇文章实现文档列表将轻车熟路,因为逻辑基本相似,只是查询条件的不同.这里将txt,doc,docx,ppt,pptx,xls,xlsx的文件都归为文档列表中. 系列 ...

  7. [实战]MVC5+EF6+MySql企业网盘实战(22)——图片列表

    写在前面 实现逻辑是:单击图片节点,加载所有的当前用户之前上传的图片,分页,按时间倒序加载. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MyS ...

  8. [实战]MVC5+EF6+MySql企业网盘实战(21)——网盘操作日志

    写在前面 上篇文章介绍了一个bootstrap的分页插件,这篇将弄一个完整的例子,就以日志分页为例说明如何请求服务端然后进行分页. 系列文章 [EF]vs15+ef6+mysql code first ...

  9. [实战]MVC5+EF6+MySql企业网盘实战(20)——Bootstrap Paginator

    写在前面 考虑到数据量的问题,特引入bootstrap的分页插件.插件下载地址:https://github.com/lyonlai/bootstrap-paginator 系列文章 [EF]vs15 ...

随机推荐

  1. WPF系列之三:实现类型安全的INotifyPropertyChanged接口,可以不用“Magic string” 么?

    通常实现INotifyPropertyChanged接口很简单,为你的类只实现一个PropertyChanged 的Event就可以了. 例如实现一个简单的ViewModel1类: public cl ...

  2. 巧用Java中Calendar工具类

    Java的JDK中提供了一系列好用的util工具类.Calendar就是java.util中用于处理日期的工具类.且该工具类易学易用实用. 工具类Calendar是抽象类. PS:为什么把Calend ...

  3. OpenCV---超大图像二值化和空白区域过滤

    超大图像的二值化方法 1.可以采用分块方法, 2.先缩放处理就行二值化,然后还原大小 一:分块处理超大图像的二值化问题 def big_image_binary(image): print(image ...

  4. centos7-java模拟cpu占用高及排查

    环境 centos7 1核2GB Java8 模拟cpu占用高 新建一个名为jvm-learn的springboot项目 模拟代码如下 import org.springframework.boot. ...

  5. 课程设计——利用信号量实现读-写者问题(JAVA)

    package cn.Douzi.ReadWriter; import java.util.Scanner; public class ReadWrite { static public int co ...

  6. c# WebService SOAP及Rest调用

    SOAP及Rest的调用区别参照如下: REST似乎在一夜间兴起了,这可能引起一些争议,反对者可以说REST是WEB诞生之始甚而是HTTP出现之日就相伴而生的原则.但是毋庸置疑的事实是,在Google ...

  7. 数组与集合List的相互转化

    数组转化为集合 #此运用的是Arrays中的asList方法,返回一个List集合 *当数组元素为基本数据类型是把整个数组当作一个元素放入List集合中,代码举例: ,,}; List<int[ ...

  8. Stat3—因子分析(Factor Analysis)

    题注:主成分分析分析与因子分析也有不同,主成分分析仅仅是变量变换,而因子分析需要构造因子模型.主成分分析:原始变量的线性组合表示新的综合变量,即主成分:因子分析:潜在的假想变量和随机影响变量的线性组合 ...

  9. 【CodeForces】576 C. Points on Plane

    [题目]C. Points on Plane [题意]给定坐标系中n个点的坐标(范围[0,10^6]),求一种 [ 连边形成链后总长度<=2.5*10^9 ] 的方案.n<=10^6. [ ...

  10. ActiveMQ笔记之安装(Linux)

    1. 基本概念 MQ(MessageQueue),消息队列,是一个消息接收和转发的容器. Apache ActiveMQ是一个JMS Provider实现. 2. 安装 从官网下载安装包: wget ...