public async Task ExportUserDataAsync(string timeStamp) { //分区的PartionKey,序列化处理本分区的数据 var partionId = this._serviceContext.PartitionId.ToString("N"); var userDataFile = new UserDataFileDto() { Timestamp = timeStamp, PartitionId = partionId }; var users = await this._userDomainService.GetAllUsersAsync(); var mappedUsers = new List <UserItemDto>(); foreach (var user in users) { var item = _mapper.Map <UserItemDto>(user); item.Password = user.GetHashedPassword(); mappedUsers.Add(item); } using (var ms = new MemoryStream()) using (var tw = new StreamWriter(ms, Encoding.UTF8)) using (var csv = new CsvWriter(tw)) { csv.Configuration.RegisterClassMap <CsvUserItemDtoMapper>(); csv.WriteRecords(mappedUsers); tw.Flush(); ms.Position = 0; await _userDataStorageService.SaveUserDataAsync(userDataFile, ms); } ServiceEventSource.Current.Message("用户数据导出:导出数据文件{0}.csv,用户数量:{1}", userDataFile.FileName, mappedUsers.Count); }
public async Task <IActionResult> ImportUserData() { var files = this.HttpContext.Request.Form.Files; foreach (var file in files) { if (!file.IsCSVFile()) { return(Json(false, null, "上传文件中存在非.csv结尾的文件,请重新选择上传")); } } var tasks = new List <Task>(); foreach (var file in files) { var item = new UserDataFileDto(); var splited = Path.GetFileNameWithoutExtension(file.FileName).Split("_"); item.Timestamp = splited[0]; item.PartitionId = splited[1]; tasks.Add(this.ImportUserDataAsync(item, file.OpenReadStream())); } //这里要进行并行进行 await Task.WhenAll(tasks); return(Json(true, null, "上传成功")); }
/// <summary> /// 序列化.csv文件的内容 /// </summary> /// <param name="file"></param> /// <param name="stream"></param> /// <returns></returns> private async Task <IEnumerable <UserItemDto> > ImportCsvUserDataAsync(UserDataFileDto file, Stream stream) { using (TextReader tr = new StreamReader(stream)) { try { var csv = new CsvReader(tr); csv.Configuration.RegisterClassMap <CsvUserItemDtoMapper>(); var result = csv.GetRecords <UserItemDto>().ToList(); var resultCount = result?.LongCount() ?? 0; ServiceEventSource.Current.Message("用户数据导入(解析阶段):" + "导入用户数据文件{0}.csv,用户数量:{1}", file.FileName, resultCount); return(await Task.FromResult(_mapper.Map <IEnumerable <UserItemDto> >(result))); } catch (Exception e) { ServiceEventSource.Current.Message("用户数据导入(解析阶段)发生错误:" + "导入用户数据文件{0},错误信息:{1}", file.FileName, e.ToString()); return(null); } } }
public async Task SaveUserDataAsync(UserDataFileDto file, Stream stream) { if (file == null) { throw new ArgumentNullException(nameof(file)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (_minioOption == null) { throw new Exception("Minio配置为空!"); } var bucketOperations = this.GetBucketOperations(); var objectOperations = this.GetObjectOperations(); try { if (!bukeNameExist) { if (!await bucketOperations.BucketExistsAsync(bucketName)) { await bucketOperations.MakeBucketAsync(bucketName); bukeNameExist = true; } } await objectOperations.PutObjectAsync(bucketName, file.FileName + ".csv", stream, stream.Length); ServiceEventSource.Current.Message("用户数据上传到Minio完成:{0}", file.FileName); } catch (Exception e) { ServiceEventSource.Current.Message("用户数据上传到Minio失败:{0},原因:", e.ToString()); } }
public async Task SaveUserDataAsyncTest_Correct() { var service = new MockMinioUserDataStorageService(this.Minioption); var file = new UserDataFileDto() { PartitionId = "12345", Timestamp = "12345" }; var Memorystream = new MemoryStream(Encoding.UTF8.GetBytes("测试数据")); await service.SaveUserDataAsync(file, Memorystream); //Act: var mockObject = service.MoqObject; var mockBucket = service.MoqBucket; mockBucket.Verify(u => u.BucketExistsAsync(It.Is <string>(x => x == "userexported"), It.IsAny <CancellationToken>()), Times.Once); mockBucket.Verify(u => u.MakeBucketAsync(It.Is <string>(x => x == "userexported"), It.IsAny <string>(), It.IsAny <CancellationToken>()), Times.Once); mockObject.Verify(u => u.PutObjectAsync(It.Is <string>(x => x == "userexported"), It.IsAny <string>(), It.IsAny <Stream>(), It.IsAny <long>(), It.IsAny <string>(), It.IsAny <Dictionary <string, string> >(), It.IsAny <ServerSideEncryption>(), It.IsAny <CancellationToken>()), Times.Once); }
public async Task ImportUserDataAsync(UserDataFileDto file, Stream stream) { var userItems = await this.ImportCsvUserDataAsync(file, stream); foreach (var item in userItems) { var(user, appService) = await _userAppServiceClient.FindByUserIdAsync(item.Id.ToString()); if (user != null) { continue; } var result = await _userAppServiceClient.CreateUserAsync(item, true); if (result != null) { ServiceEventSource.Current.Message("用户数据还原:用户Id:{0}", result.Id.ToString("N")); } else { ServiceEventSource.Current.Message("用户数据还原失败:用户Id:{0}", item.Id.ToString("N")); } } }