public async Task <FileInfoVm> LoadFileInfoAsync(string fileId) { using (MessengerDbContext context = contextFactory.Create()) { var fileInfo = await context.FilesInfo .AsNoTracking() .FirstOrDefaultAsync(file => file.Id == fileId && file.Deleted == false).ConfigureAwait(false); if (fileInfo == null) { List <FileInfoVm> filesInfo = await _nodeRequestSender.GetFilesInformationAsync(new List <string> { fileId }, null).ConfigureAwait(false); if (!filesInfo.IsNullOrEmpty()) { return(filesInfo.FirstOrDefault()); } } return(FileInfoConverter.GetFileInfoVm(fileInfo)); } }
public async Task <IActionResult> Get(string id) { try { var fileInfo = await filesService.GetFileInfoAsync(id).ConfigureAwait(false); if (fileInfo == null) { var nodeConnections = connectionsService.GetNodeConnections().Where(conn => conn.NodeWebSocket.State == WebSocketState.Open); foreach (var nodeConnection in nodeConnections) { var filesInfo = await nodeRequestSender.GetFilesInformationAsync(new List <string> { id }, nodeConnection.Node.Id).ConfigureAwait(false); if (!filesInfo.Any()) { continue; } Uri fileUri = new Uri($"https://{nodeConnection.Node.Domains.FirstOrDefault()}:{nodeConnection.Node.NodesPort}/api/Files/{id}"); var fileRequest = WebRequest.CreateHttp(fileUri); fileRequest.Method = HttpMethods.Get; var fileResponse = (HttpWebResponse)await fileRequest.GetResponseAsync().ConfigureAwait(false); var contentDisposition = fileResponse.Headers["content-disposition"]; string filename = id; if (contentDisposition != null) { System.Net.Mime.ContentDisposition disposition = new System.Net.Mime.ContentDisposition(contentDisposition); filename = disposition.FileName; } return(File(fileResponse.GetResponseStream(), MediaTypeNames.Application.Octet, filename)); } return(StatusCode(StatusCodes.Status404NotFound)); } if (fileInfo.Storage == "Local" || string.IsNullOrWhiteSpace(fileInfo.Storage)) { LocalFileStorage localFileStorage = new LocalFileStorage(); if (fileInfo != null && fileInfo.Url != null) { return(File(await localFileStorage.GetStreamAsync(fileInfo.Url).ConfigureAwait(false), MediaTypeNames.Application.Octet, fileInfo.FileName)); } else if (fileInfo != null && fileInfo.Url == null && fileInfo.NodeId != NodeSettings.Configs.Node.Id) { NodeVm nodeInformation = await nodesService.GetAllNodeInfoAsync(fileInfo.NodeId).ConfigureAwait(false); Uri fileUri = new Uri($"https://{nodeInformation.Domains.FirstOrDefault()}:{nodeInformation.NodesPort}/api/Files/{fileInfo.Id}"); var fileRequest = WebRequest.CreateHttp(fileUri); fileRequest.Method = HttpMethods.Get; var fileResponse = await fileRequest.GetResponseAsync().ConfigureAwait(false); return(File(fileResponse.GetResponseStream(), MediaTypeNames.Application.Octet, fileInfo.FileName)); } else { return(NotFound()); } } else if (!string.IsNullOrWhiteSpace(fileInfo.Storage)) { var stream = await fileStorage.GetStreamAsync(fileInfo.Id).ConfigureAwait(false); return(File(stream, MediaTypeNames.Application.Octet, fileInfo.FileName)); } else { return(NotFound()); } } catch (DownloadFileException ex) { if (ex.InnerException is WebException webException) { Console.WriteLine(ex.InnerException.ToString()); return(StatusCode(StatusCodes.Status503ServiceUnavailable)); } return(StatusCode(StatusCodes.Status500InternalServerError)); } catch (ObjectDoesNotExistsException) { return(NotFound()); } catch (Exception ex) { Logger.WriteLog(ex); return(StatusCode(StatusCodes.Status500InternalServerError)); } }