public void MultipartRequestHelperTest_HasFormDataContentDispositionTrue() { var formdata = new Microsoft.Net.Http.Headers.ContentDispositionHeaderValue("form-data"); Assert.AreEqual(true, MultipartRequestHelper.HasFormDataContentDisposition(formdata)); }
public void MultipartRequestHelperTest_HasFileContentDisposition() { var formdata = new Microsoft.Net.Http.Headers.ContentDispositionHeaderValue("form-data"); formdata.FileName = "test"; formdata.FileNameStar = "1"; Assert.AreEqual("form-data; filename=test; filename*=UTF-8''1", formdata.ToString()); Assert.AreEqual(true, MultipartRequestHelper.HasFileContentDisposition(formdata)); }
public async Task <IActionResult> ReportSheet(long id, CancellationToken cancellationToken) { try { var model = await _appDb.MatchRepository.GetMatchReportSheetAsync(_siteContext.MatchPlanTournamentId, id, cancellationToken); if (model == null) { return(NotFound()); } #region ** Puppeteer PDF generation using Chromium ** var options = new PuppeteerSharp.LaunchOptions { Headless = true, Args = new[] { "--no-sandbox", "--disable-gpu", "--disable-extensions" }, ExecutablePath = Path.Combine(Directory.GetCurrentDirectory(), @"Chromium-Win\chrome.exe"), Timeout = 10000 }; // Use Puppeteer as a wrapper for the Chromium browser, which can generate PDF from HTML using var browser = await PuppeteerSharp.Puppeteer.LaunchAsync(options); using var page = await browser.NewPageAsync(); // page.GoToAsync("url"); var html = await _razorViewToStringRenderer.RenderViewToStringAsync( $"~/Views/{nameof(Match)}/{ViewNames.Match.ReportSheet}.cshtml", model); await page.SetContentAsync(html); // Bootstrap 4 is loaded from CDN var contentDisposition = new Microsoft.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); contentDisposition.SetHttpFileName($"{_localizer["Report Sheet"].Value} {model.Id}.pdf"); Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.ContentDisposition] = contentDisposition.ToString(); return(new FileStreamResult(await page.PdfStreamAsync(new PuppeteerSharp.PdfOptions { Scale = 1.0M, Format = PaperFormat.A4 }), "application/pdf")); #endregion // For development: return HTML // return View(ViewNames.Match.ReportSheet, model); } catch (Exception e) { _logger.LogCritical(e, $"{nameof(ReportSheet)} failed for match ID '{id}'"); throw; } }
private async Task <IDictionary <string, Uri> > SaveFiles(Guid itemId, ICollection <IFormFile> files) { _logger.LogInformation($"Files: {files.Count}"); var result = new Dictionary <string, Uri>(); foreach (var file in files) { var filename = ContentDispositionHeaderValue .Parse(file.ContentDisposition) .FileName .Trim('"'); _logger.LogInformation($"FileName: {filename}"); var credentials = new StorageCredentials(_settings.AzureStorageName, _settings.AzureStorageKey); var storageAccount = new CloudStorageAccount(credentials, true); var fileClient = storageAccount.CreateCloudFileClient(); var share = fileClient.GetShareReference(_settings.AzureStorageFileShareName); if (await share.CreateIfNotExistsAsync()) { var directory = share.GetRootDirectoryReference(); var fileRef = directory.GetFileReference(filename); if (await fileRef.DeleteIfExistsAsync()) { using (var stream = file.OpenReadStream()) { await fileRef.UploadFromStreamAsync(stream); } result.Add(filename, fileRef.Uri); } } } return(result); }
public FormMultipartSection(Microsoft.AspNetCore.WebUtilities.MultipartSection section, Microsoft.Net.Http.Headers.ContentDispositionHeaderValue header) { }
public static bool IsFormDisposition(this Microsoft.Net.Http.Headers.ContentDispositionHeaderValue header) { throw null; }
public static bool TryParse(Microsoft.Extensions.Primitives.StringSegment input, out Microsoft.Net.Http.Headers.ContentDispositionHeaderValue parsedValue) { throw null; }
public static bool TryParse(string input, out Microsoft.Net.Http.Headers.ContentDispositionHeaderValue parsedValue) { parsedValue = default(Microsoft.Net.Http.Headers.ContentDispositionHeaderValue); throw null; }
public async Task <IActionResult> ReportSheet(long id, CancellationToken cancellationToken) { var pathToChromium = Path.Combine(Directory.GetCurrentDirectory(), _configuration["Chromium:ExecutablePath"]); MatchReportSheetRow model = null; try { model = await _appDb.MatchRepository.GetMatchReportSheetAsync(_tenantContext.TournamentContext.MatchPlanTournamentId, id, cancellationToken); if (model == null) { return(NotFound()); } if (System.IO.File.Exists(pathToChromium)) { #region ** Puppeteer PDF generation using Chromium ** var options = new PuppeteerSharp.LaunchOptions { // --use-cmd-decoder=passthrough causes Chromium error Headless = true, Args = new[] { "--no-sandbox", "--disable-gpu", "--disable-extensions", "--use-cmd-decoder=validating" }, ExecutablePath = pathToChromium, Timeout = 10000 }; // Use Puppeteer as a wrapper for the Chromium browser, which can generate PDF from HTML using var browser = await PuppeteerSharp.Puppeteer.LaunchAsync(options).ConfigureAwait(false); using var page = await browser.NewPageAsync().ConfigureAwait(false); // page.GoToAsync("url"); var html = await _razorViewToStringRenderer.RenderViewToStringAsync( $"~/Views/{nameof(Match)}/{ViewNames.Match.ReportSheet}.cshtml", model); await page.SetContentAsync(html); // Bootstrap 4 is loaded from CDN var contentDisposition = new Microsoft.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); contentDisposition.SetHttpFileName($"{_localizer["Report Sheet"].Value} {model.Id}.pdf"); Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.ContentDisposition] = contentDisposition.ToString(); browser.Process?.Refresh(); _logger.LogInformation( "Chromium Process physical memory: {0:#,0} bytes. Start arguments: {1}", browser.Process?.WorkingSet64, browser.Process?.StartInfo.Arguments); // Test, whether the chromium browser renders at all /* return new FileStreamResult( * await page.ScreenshotStreamAsync(new PuppeteerSharp.ScreenshotOptions * {FullPage = true, Quality = 100, Type = ScreenshotType.Jpeg}).ConfigureAwait(false), * "image/jpeg"); */ // Todo: This part works on the development machine, but throws on the external web server var result = new FileStreamResult( await page.PdfStreamAsync(new PuppeteerSharp.PdfOptions { Scale = 1.0M, Format = PaperFormat.A4 }).ConfigureAwait(false), "application/pdf"); _logger.LogInformation("PDF stream created with length {0}", result.FileStream.Length); await browser.CloseAsync(); return(result); /* Todo: This is a working fallback code, which acts with Chromium directly, and requires the Url to the HTML content * var tempdir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); * if (Directory.Exists(tempdir)) Directory.CreateDirectory(tempdir); * var tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); * var si = new System.Diagnostics.ProcessStartInfo(pathToChromium, * $"--disable-background-networking --enable-features=NetworkService,NetworkServiceInProcess --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=TranslateUI --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-sync --force-color-profile=srgb --metrics-recording-only --no-first-run --enable-automation --password-store=basic --use-mock-keychain --headless --hide-scrollbars --mute-audio --no-sandbox --disable-gpu --disable-extensions --use-cmd-decoder=validating --no-margins --user-data-dir={tempdir} --print-to-pdf={tempFile} https://volleyball-liga.de/") * {CreateNoWindow = true, UseShellExecute = false}; * var proc = System.Diagnostics.Process.Start(si); * proc.WaitForExit(5000); * _logger.LogInformation("{0}", proc.ExitCode); * var stream = System.IO.File.OpenRead(tempFile); * return new FileStreamResult(stream, "application/pdf"); */ #endregion } } catch (Exception e) { _logger.LogCritical(e, $"{nameof(ReportSheet)} failed for match ID '{id}'"); } // without Chromium installed or throwing exception: return HTML Response.Clear(); return(View(ViewNames.Match.ReportSheet, model)); }