博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[实战]MVC5+EF6+MySql企业网盘实战(14)——逻辑重构
阅读量:7246 次
发布时间:2019-06-29

本文共 5312 字,大约阅读时间需要 17 分钟。

写在前面

上篇文章关于修改文件夹和文件名称导致的找不到物理文件的问题,这篇文章将对其进行逻辑的修改。

系列文章

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

上传文件

将上传的文件保存在网站的根目录下的NetDisk文件夹中。根据文件的md5值判断文件是否已经存在了,如果存在则不再保存文件,只是在数据库中插入一条新的文件信息记录,用于区别该文件所在路径以及名称。

[HttpPost]        public void UploadFile(string filePath)        {            UserInfo userInfo = Session["user"] as UserInfo;            //保证路径格式一直以/结束            filePath = filePath.TrimEnd('/') + "/";            if (userInfo == null)            {                RedirectToAction("Login", "UserInfo");            }            filePath = 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);            }        }

总结

这里对上传文件的逻辑进行了一下修改。

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

你可能感兴趣的文章
利用QRCode实现待logo的二维码的创建
查看>>
【云周刊】第190期:阿里云超算揭秘:虚拟机的心脏,物理机的肌肉
查看>>
崩溃bug日志总结3
查看>>
推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
查看>>
shell技巧5 - 全自动打包ipa
查看>>
uC/OS-II源码分析(六)
查看>>
阿里、美团、网易、华为等二十厂秋招Java面经大合集
查看>>
为什么说,“景区”AI 改造势在必行
查看>>
第十八章:MVVM(二)
查看>>
进程调度(二)
查看>>
python元组,集合类型,及字典补充
查看>>
9、python函数进阶
查看>>
Markdown一看就会
查看>>
dotweb——go语言的一个微型web框架(一)
查看>>
又是一个名叫草泥马的项目:thefuck
查看>>
《七周七并发模型》作者Paul Butcher访谈问题有奖征集
查看>>
linux基本功能的一些命令(用户,系统信息,包管理等)
查看>>
使用 dnscrypt-proxy 防止 dns 污染
查看>>
专访孙睿 :能做自己,去做自己想做的,是件挺幸福的事儿
查看>>
滴滴开源跨平台统一 MVVM 框架 Chameleon
查看>>