Ejemplo n.º 1
0
        /// <summary>
        /// Uploads prepare.
        /// 此时会把文件记录到临时表,DFS为空,reversion从file表中获取,该文件ID不代表在File中的ID
        /// </summary>
        /// <returns></returns>
        public JsonResult UploadPrepare(UploadPrepareModel model)
        {
            //FileName
            OauthTokenPair pair = unitOfWork.TokenReposity.GetTokenPair(model.oauth_token);
            NetDiskUser    user = unitOfWork.UserRepositiry.dbSet.SingleOrDefault(u => u.UserId == pair.UserId);

            db.NetdiskUsers.Attach(user);
            FileUncomplete fileUncomplete = new FileUncomplete
            {
                FileName    = model.FileName.GetFileName(),
                FilePath    = model.FileName.GetFilePath(),
                FileSize    = model.FileSize,
                Hash        = model.Hash,
                IsCompleted = false,
                Owner       = user
            };
            UploadPrepareViewModel viewmodel = new UploadPrepareViewModel();

            //以该hash的的相同路径的最新版本作为当前版本
            File thisVersion = db.Files.Where(f => f.FileName == fileUncomplete.FileName && f.FilePath == fileUncomplete.FilePath && f.Hash == model.Hash && !f.IsDeleted).OrderByDescending(f => f.Id).FirstOrDefault();

            if (thisVersion != null)
            {
                viewmodel.IsExitsRemote = true;
            }
            else
            {
                viewmodel.IsExitsRemote = false;
            }

            if (viewmodel.IsExitsRemote)
            {
                viewmodel.RemoteId        = thisVersion.Id;
                viewmodel.RemoteHash      = thisVersion.Hash;
                viewmodel.RemoteReversion = thisVersion.Reversion;
            }
            else
            {
                try
                {
                    db.FileUncomplete.Add(fileUncomplete);
                    db.SaveChanges();
                    viewmodel.ret     = 0;
                    viewmodel.Id      = fileUncomplete.Id;
                    viewmodel.hash    = fileUncomplete.Hash;
                    viewmodel.DFSPath = "\\" + fileUncomplete.Hash;
                }
                catch (System.Exception ex)
                {
                    viewmodel.ret = -1;
                    viewmodel.msg = "save file to FileUncomplete failed!err info:" + ex.Message;
                }
            }

            return(Json(viewmodel, JsonRequestBehavior.AllowGet));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Uploads complete.
        /// 把临时记录删除,并记录到File表
        /// 如果有冲突,即该版本号已经存在,则返回冲突消息
        /// 同时发布更新消息(更新消息发布到以该用户UserId为channelId的channel上),所有以该帐号登录的客户端都要订阅该Channel
        /// 客户端收到该请求的返回之后应该更新本地的文件ID与版本号
        /// </summary>
        /// <returns></returns>
        public JsonResult UploadComplete(UploadCompleteModel model)
        {
            OauthTokenPair pair = unitOfWork.TokenReposity.GetTokenPair(model.oauth_token);
            NetDiskUser    user = unitOfWork.UserRepositiry.dbSet.SingleOrDefault(u => u.UserId == pair.UserId);

            db.NetdiskUsers.Attach(user);
            FileUncomplete          fileUncomplete = db.FileUncomplete.SingleOrDefault(f => f.Id == model.Id);
            uploadCompleteViewModel viewModel      = new uploadCompleteViewModel();

            if (fileUncomplete == null)
            {
                viewModel.ret = -1;
                viewModel.msg = "unComplete recorde is miss";
            }

            File file = new File
            {
                CreateTime     = DateTime.Now,
                DFSPath        = '\\' + fileUncomplete.Hash,
                Hash           = fileUncomplete.Hash,
                FileName       = fileUncomplete.FileName,
                FilePath       = fileUncomplete.FilePath,
                FileSize       = fileUncomplete.FileSize,
                FileType       = 1,
                IsDeleted      = false,
                LastModifyTime = DateTime.Now,
                Owner          = user,
                Reversion      = 0
            };

            if (db.Files.Count(a => a.FilePath == file.FilePath && a.FileName == file.FileName && !a.IsDeleted) > 0)
            {
                //已经有文件,返回冲突消息
                file.FileName         = file.FileName + "_conflict_copy";
                viewModel.Conflicted  = true;
                viewModel.NewFilename = file.FilePath + file.FileName;
            }
            else
            {
                viewModel.Conflicted = false;
                try
                {
                    File last = db.Files.Where(f => f.FilePath == file.FilePath && f.FileName == file.FileName).OrderByDescending(f => f.Reversion).FirstOrDefault();
                    if (last != null)
                    {
                        file.Reversion = last.Reversion + 1;
                    }
                    else
                    {
                        file.Reversion = 0;
                    }

                    db.Files.Add(file);
                    db.SaveChanges();
                    viewModel.Id          = file.Id;
                    viewModel.ret         = 0;
                    viewModel.NewFilename = file.FilePath + file.FileName;
                    viewModel.Reversion   = file.Reversion;

                    db.FileUncomplete.Remove(fileUncomplete);
                    db.SaveChanges();
                }
                catch (System.Exception ex)
                {
                    viewModel.ret = -1;
                    viewModel.msg = "save db failed,err info:" + ex.Message;
                }
            }
            return(Json(viewModel, JsonRequestBehavior.AllowGet));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 记录修改数据到fileuncomplete表
        /// 返回文件id等,客户端收到之后应该完整上传
        /// </summary>
        /// <returns></returns>
        public JsonResult ModifyPrepare(ModifyPrepareModel model)
        {
            //根据客户端提供的路径查找最新版,看版本Id是否过期,如果过期则返回过期,客户端提示版本冲突,创建新文件重新提交
            OauthTokenPair         pair      = unitOfWork.TokenReposity.GetTokenPair(model.oauth_token);
            NetDiskUser            user      = unitOfWork.UserRepositiry.dbSet.SingleOrDefault(u => u.UserId == pair.UserId);
            ModifyPrepareViewModel viewModel = new ModifyPrepareViewModel();

            if (user == null)
            {
                viewModel.ret = -1;
                viewModel.msg = "cannot find the user in cache, relogin may help";
                return(Json(viewModel, JsonRequestBehavior.AllowGet));
            }


            db.NetdiskUsers.Attach(user);
            FileUncomplete fileUncomplete = new FileUncomplete
            {
                FileName    = model.LocalPath.GetFileName(),
                FilePath    = model.LocalPath.GetFilePath(),
                FileSize    = model.NewFileSize,
                Hash        = model.NewHash,
                IsCompleted = false,
                Owner       = user
            };


            File lastversion = db.Files.Where(f => f.FileName == fileUncomplete.FileName && f.FilePath == fileUncomplete.FilePath).OrderByDescending(f => f.Id).FirstOrDefault();

            if (lastversion == null)
            {
                viewModel.ret = -1;
                viewModel.msg = "can not find the file specified";
                return(Json(viewModel, JsonRequestBehavior.AllowGet));
            }
            else
            {
                if (model.LocalId < lastversion.Id) //过期
                {
                    viewModel.IsOutOfData = true;
                }
                else if (model.LocalId == lastversion.Id && lastversion.IsDeleted) //过期,最后一个版本已经被删除
                {
                    viewModel.IsOutOfData = true;
                    viewModel.IsDeleted   = true;
                }
                else
                {
                    viewModel.IsOutOfData = false;
                    viewModel.IsDeleted   = false;
                    try
                    {
                        fileUncomplete.Reversion = lastversion.Reversion + 1;
                        db.FileUncomplete.Add(fileUncomplete);
                        db.SaveChanges();
                        viewModel.ret     = 0;
                        viewModel.Id      = fileUncomplete.Id;
                        viewModel.DFSPath = "\\" + fileUncomplete.Hash;
                    }
                    catch (System.Exception ex)
                    {
                        viewModel.ret = -1;
                        viewModel.msg = "save file to FileUncomplete failed!err info:" + ex.Message;
                    }
                }
            }


            return(Json(viewModel, JsonRequestBehavior.AllowGet));
        }