Ejemplo n.º 1
0
        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));
            }
        }
Ejemplo n.º 2
0
        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));
            }
        }