public async Task <IActionResult> UploadFileStream() { string fileNameFinaliy = ""; try { if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType)) { ModelState.AddModelError("Error", $"The request couldn't be processed (Error -1)."); return(BadRequest(ModelState)); } if (!MultipartRequestHelper.ValidateAntiforgeryToken(Request.Headers)) { ModelState.AddModelError("Error", $"The request couldn't be processed (Error 0)."); return(BadRequest(ModelState)); } var formAccumulator = new KeyValueAccumulator(); var trustedFileNameForDisplay = string.Empty; var streamedFileContent = new HugeMemoryStream(); var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), _defaultFormOptions.MultipartBoundaryLengthLimit); var reader = new MultipartReader(boundary, HttpContext.Request.Body); var section = await reader.ReadNextSectionAsync(); if (section == null) { ModelState.AddModelError("Error", $"The request couldn't be processed (Error 1)."); return(BadRequest(ModelState)); } while (section != null) { var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition); if (hasContentDispositionHeader) { if (MultipartRequestHelper.HasFileContentDisposition(contentDisposition)) { trustedFileNameForDisplay = WebUtility.HtmlEncode(contentDisposition.FileName.Value); streamedFileContent = await FileHelpers.ProcessStreamedFile(section, contentDisposition, ModelState, _permittedExtensions, _fileSizeLimit); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } } else if (MultipartRequestHelper.HasFormDataContentDisposition(contentDisposition)) { var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name).Value; var encoding = GetEncoding(section); if (encoding == null) { ModelState.AddModelError("Error", $"The request couldn't be processed (Error 2)."); return(BadRequest(ModelState)); } using (var streamReader = new StreamReader( section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { var value = await streamReader.ReadToEndAsync(); if (string.Equals(value, "undefined", StringComparison.OrdinalIgnoreCase)) { value = string.Empty; } formAccumulator.Append(key, value); if (formAccumulator.ValueCount > _defaultFormOptions.ValueCountLimit) { ModelState.AddModelError("Error", $"The request couldn't be processed (Error 3)."); return(BadRequest(ModelState)); } } } } if (!ModelState.IsValid) { return(BadRequest(ModelState)); } section = await reader.ReadNextSectionAsync(); } // Bind form data to the model var formData = new FormData(); var formValueProvider = new FormValueProvider(BindingSource.Form, new FormCollection(formAccumulator.GetResults()), CultureInfo.CurrentCulture); var bindingSuccessful = await TryUpdateModelAsync(formData, prefix : "", valueProvider : formValueProvider); if (!bindingSuccessful) { ModelState.AddModelError("Error", "The request couldn't be processed (Error 5)."); return(BadRequest(ModelState)); } if (string.IsNullOrEmpty(trustedFileNameForDisplay) || streamedFileContent.Length <= 0) { ModelState.AddModelError("Error", "The request couldn't be processed (Error 6)."); return(BadRequest(ModelState)); } if (!ModelState.IsValid) { return(BadRequest(ModelState)); } string trustedFileNameForFileStorage = Path.GetRandomFileName(); fileNameFinaliy = Path.Combine(_targetFilePath, trustedFileNameForFileStorage); string mimeType = FindMimeHelpers.GetMimeFromStream(streamedFileContent); using (var targetStream = System.IO.File.Create(fileNameFinaliy)) { streamedFileContent.CopyTo(targetStream); _logger.LogInformation($"Uploaded file '{trustedFileNameForDisplay}' saved to '{_targetFilePath}' as {trustedFileNameForFileStorage}"); } var model = await SaveInDb(HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString(), fileNameFinaliy, trustedFileNameForDisplay, trustedFileNameForFileStorage, streamedFileContent.Length, mimeType); return(new OkObjectResult(model.Hash.Trim().ToLower())); } catch (Exception ex) { if (!string.IsNullOrEmpty(fileNameFinaliy) && System.IO.File.Exists(fileNameFinaliy)) { System.IO.File.Delete(fileNameFinaliy); } ModelState.AddModelError("Error", ex.Message); if (ex.InnerException != null) { ModelState.AddModelError("InnerException", ex.InnerException.Message); } return(BadRequest(ModelState)); } }
public async Task <IActionResult> DownloadFileStream(Models.FileModel fileModel) { if (System.IO.File.Exists(fileModel.Path)) { FileStream sourceStream = new FileStream(fileModel.Path, FileMode.Open, FileAccess.Read, System.IO.FileShare.Read, BufferSize, FileOptions.Asynchronous | FileOptions.SequentialScan); ThrottledStream destinationStreamStream = null; ApplicationIdentityUser user = null; if (HttpContext.User != null) { user = await _userManager.GetUserAsync(HttpContext.User); if (user != null) { destinationStreamStream = new ThrottledStream(sourceStream, kbpsLogged); } } if (destinationStreamStream == null) { destinationStreamStream = new ThrottledStream(sourceStream, kbps); } await LoggerDownload(user, fileModel); FileStreamResult fileStreamResult = new FileStreamResult(destinationStreamStream, FindMimeHelpers.GetMimeFromFile(fileModel.Path)); fileStreamResult.FileDownloadName = fileModel.TrustedName; fileStreamResult.LastModified = fileModel.UploadDT; return(fileStreamResult); } else { ModelState.AddModelError("Error", $"The request couldn't be processed (Error 0)."); return(NotFound(ModelState)); } }
private async Task <Models.FileModel> SaveInDb(string remoteIpAddress, string fileNameFinaliy, string fileNameForDisplay, string fileNameForFileStorage, long contentType, string mimeType) { var ipInfo = await new IpDataServlet(remoteIpAddress).GetIpInfo(); var fileUploaded = new FileModel { CreationDateTime = DateTime.UtcNow, Id = Guid.NewGuid(), Size = contentType, Name = fileNameForDisplay, StorageName = fileNameForFileStorage, Type = mimeType, Hash = CreateHashFile(fileNameForDisplay, fileNameForFileStorage, remoteIpAddress, contentType), Asn = ipInfo.Asn, AsnDomain = ipInfo.AsnDomain, AsnName = ipInfo.AsnName, AsnRoute = ipInfo.AsnRoute, AsnType = ipInfo.AsnType, CallingCode = ipInfo.CallingCode, City = ipInfo.City, ContinentCode = ipInfo.ContinentCode, ContinentName = ipInfo.ContinentName, CountryCode = ipInfo.CountryCode, CountryName = ipInfo.CountryName, Ip = ipInfo.Ip, Latitude = ipInfo.Latitude, Longitude = ipInfo.Longitude, Organisation = ipInfo.Organisation, Postal = ipInfo.Postal, Region = ipInfo.Region, RegionCode = ipInfo.RegionCode, TimeZone = ipInfo.TimeZone, Languages = ipInfo.Languages }; try { if (mimeType == "application/octet-stream" || string.IsNullOrEmpty(mimeType)) { mimeType = FindMimeHelpers.GetMimeFromFile(fileNameFinaliy); } if (mimeType == "application/octet-stream" || string.IsNullOrEmpty(mimeType)) { if (FindMimeHelpers.ListOfMimeType == null || FindMimeHelpers.ListOfMimeType.Count <= 0) { FindMimeHelpers.ListOfMimeType = _context.PermittedExtension .Select(x => new { x.Extension, x.Description }) .ToDictionary(x => x.Extension, x => x.Description); } fileUploaded.Type = FindMimeHelpers.GetMimeFromExtensions(Path.GetExtension(fileNameForDisplay).ToLowerInvariant()); } } catch (Exception ex) { _logger.LogError("Erro para recuperar o MineType : " + ex.Message); if (FindMimeHelpers.ListOfMimeType == null || FindMimeHelpers.ListOfMimeType.Count <= 0) { FindMimeHelpers.ListOfMimeType = _context.PermittedExtension .Select(x => new { x.Extension, x.Description }) .ToDictionary(x => x.Extension, x => x.Description); } fileUploaded.Type = FindMimeHelpers.GetMimeFromExtensions(Path.GetExtension(fileNameForDisplay).ToLowerInvariant()); } if (string.IsNullOrEmpty(fileUploaded.Type)) { fileUploaded.Type = "application/octet-stream"; } //Salvar no Banco de Dados await _context.Files.AddAsync(fileUploaded); await _context.SaveChangesAsync(); ApplicationIdentityUser user = null; try { if (HttpContext.User != null) { user = await _userManager.GetUserAsync(HttpContext.User); if (user != null) { await _context.FilesUsers.AddAsync(new FileUserModel { Id = Guid.NewGuid(), FileId = fileUploaded.Id, UserId = user.Id, CreationDateTime = DateTime.Now }); await _context.SaveChangesAsync(); } } } catch (Exception ex) { _logger.LogError($"Erro para associar o arquivo {fileUploaded.Id} ao usuário {user?.Id} - {ex}"); } return(new Models.FileModel { Hash = fileUploaded.Hash, Id = fileUploaded.Id, Size = fileUploaded.Size, UntrustedName = fileUploaded.Name, UploadDT = fileUploaded.CreationDateTime }); }
public async void JobImportNewFiles(PerformContext context) { if (isInProcessJobImportNoewFiles) { context.WriteLine("Job já em processamento."); return; } try { isInProcessJobImportNoewFiles = true; context.WriteLine("Job Inicializado"); ApplicationDbContext _context = _serviceProvider.GetService <ApplicationDbContext>(); var filesInDrive = Directory.GetFiles(_targetFilePath) .Where(x => !x.Contains("index.htm") && !x.Contains("Extensions.txt") && _permittedExtensions.Contains(Path.GetExtension(x).ToLowerInvariant())) .Select(x => x.Split("\\").Last()) .ToList(); var filesInDb = await _context.Files.Select(x => x.StorageName) .ToListAsync(); var filesNotInported = filesInDrive.Where(x => !filesInDb.Contains(x)).ToList(); context.WriteLine($"Total de arquivos a importar {filesNotInported.Count}"); var ipInfo = await new IpDataServlet().GetIpInfo(); foreach (var file in filesNotInported) { try { var fileWithPath = Path.Combine(_targetFilePath, file); if (File.Exists(fileWithPath)) { FileInfo info = new FileInfo(fileWithPath); var contentType = FindMimeHelpers.GetMimeFromFile(fileWithPath); FileModel model = new FileModel { CreationDateTime = DateTime.UtcNow, Id = Guid.NewGuid(), Size = info.Length, Name = file, StorageName = file, Type = contentType, Hash = CreateHashFile(file, file, ipInfo.Ip, info.Length), Asn = ipInfo.Asn, AsnDomain = ipInfo.AsnDomain, AsnName = ipInfo.AsnName, AsnRoute = ipInfo.AsnRoute, AsnType = ipInfo.AsnType, CallingCode = ipInfo.CallingCode, City = ipInfo.City, ContinentCode = ipInfo.ContinentCode, ContinentName = ipInfo.ContinentName, CountryCode = ipInfo.CountryCode, CountryName = ipInfo.CountryName, Ip = ipInfo.Ip, Latitude = ipInfo.Latitude, Longitude = ipInfo.Longitude, Organisation = ipInfo.Organisation, Postal = ipInfo.Postal, Region = ipInfo.Region, RegionCode = ipInfo.RegionCode, TimeZone = ipInfo.TimeZone, Languages = ipInfo.Languages }; _context.Files.Add(model); await _context.SaveChangesAsync(); } else { context.WriteLine($"Arquivo invalido {fileWithPath}"); } } catch (Exception ex) { context.WriteLine($"Erro no Arquivo {file} : {ex}"); } } } catch (Exception ex) { context.WriteLine($"Erro no Job : {ex}"); _logger.LogError(ex, $"Error on Job JobImportNewFiles {context.BackgroundJob.Id}-{ex}"); } finally { isInProcessJobImportNoewFiles = false; } }