写在前面

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

系列文章

[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. Uoj308【UNR #2】UOJ拯救计划

    分析:比较难分析的一道题,先把式子写出来,ans=∑C(k,i)*f(i),f(i)是选i个颜色的方案数.这个模数有点奇怪,比较小而且是合数,说不定就会有某种规律,如果i >= 3,可以发现C( ...

  2. JNI实现JAVA和C++互相调用

    SDK.h #ifndef SDK_H #define SDK_H #include "AsyncProxy.h" #include "Module.h" #i ...

  3. poj 1067 取石子游戏 (威佐夫博弈)

    取石子游戏 http://poj.org/problem?id=1067 Time Limit: 1000MS   Memory Limit: 10000K       Description 有两堆 ...

  4. POJ 2007 Scrambled Polygon 极角序 水

    LINK 题意:给出一个简单多边形,按极角序输出其坐标. 思路:水题.对任意两点求叉积正负判断相对位置,为0则按长度排序 /** @Date : 2017-07-13 16:46:17 * @File ...

  5. LightOJ 1096 - nth Term 矩阵快速幂

    http://www.lightoj.com/volume_showproblem.php?problem=1096 题意:\(f(n)  = a * f(n-1) + b * f(n-3) + c, ...

  6. bootstrap模态框 内部input无法手动获取焦点

    //重写enforceFocus方法$(document).ready(function(){ $.fn.modal.Constructor.prototype.enforceFocus = func ...

  7. .net core 中 identity server 4 之术语

    id4的职责: 保护你的资源 通过本地 账户库(Account Store)或者外部身份提供其 认证用户 提供Session管理以及SSO 管理和认证客户端 发行身份及访问Token给客户端 验证To ...

  8. 集合框架小结-Collection

    1.集合框架作为处理对象的容器存在,基本接口是Collection,相对于数组而言的话,集合框架只能存储对象,但是长度是可变的.集合框架的关系图如下: 主要的内容是list.set.map, List ...

  9. MongoDB中的基础概念:Databases、Collections、Documents

    MongoDB以BSON格式的文档(Documents)形式存储.Databases中包含集合(Collections),集合(Collections)中存储文档(Documents). BSON是一 ...

  10. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...