private async Task SendFile() { if (SelectedMyRoom == null) { ShowNotification("Room not selected"); return; } var dialog = new OpenFileDialog(); dialog.ShowDialog(); if (string.IsNullOrEmpty(dialog.FileName)) { return; } var request = new FileMessageRequest { Name = dialog.SafeFileName, Path = dialog.FileName }; var thread = new Thread(new ParameterizedThreadStart(param => { _fileManager.Upload(request, SelectedMyRoom.Id); })); thread.SetApartmentState(ApartmentState.STA); thread.Start(); }
public async Task <ResponseDTO <FileDTO> > SendFileMessageAsync(FileMessageRequest request, Guid roomId, Guid userId) { var response = new ResponseDTO <FileDTO>(); var room = await _context.Rooms.FirstOrDefaultAsync(r => r.Id == roomId); if (room == null) { response.Error = new Error(404, "Room not found"); return(response); } if (!room.Participants.Select(p => p.UserId).Contains(userId)) { response.Error = new Error(409, "You can't send message here, because you are not participant"); return(response); } var fileId = Guid.NewGuid(); var message = new MessageEntity() { Id = Guid.NewGuid(), SenderId = userId, RoomId = roomId, Content = fileId.ToString(), Type = MessageTypes.File, SendingTime = DateTime.UtcNow }; var file = new FileEntity() { Id = fileId, MessageId = message.Id, Name = request.Name, Size = request.Size, PartSize = request.PartSize, Path = request.Path, Parts = request.Parts }; await _context.Messages.AddAsync(message); await _context.Files.AddAsync(file); await _context.SaveChangesAsync(); var socketDTO = new SocketResponseDTO <MessageDTO> { Type = SocketMessageTypes.NewMessage, Model = new MessageDTO(message) }; foreach (var participantId in room.Participants.Select(p => p.UserId)) { await _chatHandler.SendMessageByUserId(participantId, socketDTO); } response.Data = new FileDTO(file); return(response); }
public async void Upload(FileMessageRequest file, Guid roomId) { file.Size = File.OpenRead(file.Path).Length; file.PartSize = BufferSize; file.Parts = (int)Math.Ceiling(file.Size / (double)BufferSize); var response = await _httpManager.PostAsync <FileDTO>($"api/Rooms/{roomId.ToString()}/FileMessages", file); if (response.Error != null) { Failed?.Invoke(response.Error.ErrorDescription); return; } var position = 0; var part = 1; while (position < file.Size) { byte[] buffer; if (position + BufferSize > file.Size) { buffer = new byte[(int)file.Size - position]; } else { buffer = new byte[BufferSize]; } using (BinaryReader reader = new BinaryReader(new FileStream(file.Path, FileMode.Open, FileAccess.Read))) { reader.BaseStream.Seek(position, SeekOrigin.Begin); if (position + BufferSize > file.Size) { reader.Read(buffer, 0, (int)file.Size - position); } else { reader.Read(buffer, 0, BufferSize); } } var request = new FilePartDTO { Content = buffer, PartNumber = part }; var resp = await _httpManager.PostAsync <bool>($"api/Files/{response.Data.Id}", request); if (resp.Error != null) { Failed?.Invoke(resp.Error.ErrorDescription); return; } position += BufferSize; } }
public override void Test_ToJson() { var msg = new FileMessageRequest(); msg.MediaId = "3a8asd892asd8asd"; OutputJson(msg); }
public async Task <IActionResult> SendFileMessage([FromRoute] Guid id, [FromBody] FileMessageRequest request) { var response = await _messageManager.SendFileMessageAsync(request, id, GetUserId()); if (response.Error != null) { return(StatusCode(response.Error.ErrorCode, response)); } return(Ok(response)); }
public async Task Test_UploadFileAsync() { var fileUrl = Path.Combine(CurrentDir, "Resources", "T1.png"); var resp = await Provider.UploadAsync(AppId, fileUrl); OutputResponse(resp); var msg = new FileMessageRequest(); msg.MediaId = resp.MediaId; OutputRequest(msg); var sendResp = await Provider.SendAsync(AppId, msg); OutputResponse(sendResp); }