/// <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)); }
/// <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)); }
/// <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)); }