逻辑重构

写在前面

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

上传文件

将上传的文件保存在网站的根目录下的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);
    }
}

总结

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