private CommonResponse FinshFastUpload(FinishUploadRequest request)
        {
            ErrorCodes errorCode = ErrorCodes.NoError;

            if (!CheckUploadFinishInfo(request.Md5, request.RecognizeId, request.UserName, out errorCode))
            {
                return(new CommonResponse()
                {
                    Result = false, ErrorCode = errorCode
                });
            }
            using (var dbContext = createDBContext())
            {
                var fileInfo = dbContext.FileInfos.FirstOrDefault(x => x.Md5 == request.Md5);

                var machineInfo = dbContext.MachineInfos.FirstOrDefault(x => x.RecognizeId == request.RecognizeId);

                if (!string.IsNullOrEmpty(request.UserName))
                {
                    var userInfo = dbContext.UserInfos.FirstOrDefault(x => x.UserName == request.UserName);

                    var userMachineInfo = dbContext.UserMachineInfos.Where(x => x.MachineId == machineInfo.Id && x.UserId == userInfo.Id);

                    //update File
                    AddOrUpdateUserFile(userInfo.Id, fileInfo.Id, request.ClientFileName);
                }
                return(new CommonResponse()
                {
                    Result = AddOrUpdateMachineFile(machineInfo.Id, fileInfo.Id, request.ClientFileName)
                });
            }
        }
 public override Task <CommonResponse> FinishUpload(FinishUploadRequest request, ServerCallContext context)
 {
     if (request.IsFastUpload)
     {
         return(Task.FromResult(FinshFastUpload(request)));
     }
     else
     {
         return(Task.FromResult(FinishNormalUpload(request)));
     }
 }
        private CommonResponse FinishNormalUpload(FinishUploadRequest request)
        {
            //ErrorCodes errorCode = ErrorCodes.NoError;
            //if (!CheckUploadFinishInfo(request.Md5, request.RecognizeId, request.UserName, out errorCode))
            //{
            //    return new CommonResponse() { Result = false, ErrorCode = errorCode };
            //}


            if (!UploadStateManager.Instance.UploadStateCache.ContainsKey(request.Md5))
            {
                return(new CommonResponse()
                {
                    Result = false, ErrorCode = ErrorCodes.FileNotExistInServerCache
                });
            }
            //change cache file name
            var    state     = UploadStateManager.Instance.UploadStateCache[request.Md5];
            string cachePath = state.CacheFilePath;

            if (!File.Exists(cachePath))
            {
                return(new CommonResponse()
                {
                    Result = false, ErrorCode = ErrorCodes.CacheFileNotExist
                });
            }
            string newFilePath = Path.Combine(Path.GetDirectoryName(cachePath), request.Md5);

            File.Move(cachePath, newFilePath, true);

            //compare md5
            if (Helper.GetMD5HashFromFile(newFilePath) != request.Md5)
            {
                return(new CommonResponse()
                {
                    Result = false, ErrorCode = ErrorCodes.Md5CompareError
                });
            }

            using (var dbContext = createDBContext())
            {
                ServerFile fileInfo = new ServerFile()
                {
                    CreateTime = DateTime.Now,
                    Md5        = request.Md5,
                    ServerPath = newFilePath,
                    Size       = new FileInfo(newFilePath).Length
                };
                fileInfo = dbContext.Add(fileInfo).Entity;

                dbContext.SaveChanges();

                var machineInfo = dbContext.MachineInfos.FirstOrDefault(x => x.RecognizeId == request.RecognizeId);

                if (!string.IsNullOrEmpty(request.UserName))
                {
                    var userInfo = dbContext.UserInfos.FirstOrDefault(x => x.UserName == request.UserName);

                    var userMachineInfo = dbContext.UserMachineInfos.Where(x => x.MachineId == machineInfo.Id && x.UserId == userInfo.Id);

                    //update File
                    AddOrUpdateUserFile(userInfo.Id, fileInfo.Id, request.ClientFileName);
                }

                bool result = AddOrUpdateMachineFile(machineInfo.Id, fileInfo.Id, request.ClientFileName);
                //remove the cache
                if (result)
                {
                    UploadStateManager.Instance.UploadStateCache.Remove(request.Md5);
                }
                return(new CommonResponse()
                {
                    Result = result
                });
            }
        }