using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Net.Http.Headers; using System.Threading.Tasks; namespace ActionResults; public class FileActionResult : IActionResult { private readonly byte[] _contentFile; private readonly string _contentType; private readonly string _filename; public FileActionResult(byte[] contentFile, string filename) { _contentFile = contentFile; _filename = filename; _contentType = GetContentType(filename); } public async Task ExecuteResultAsync(ActionContext context) { context.HttpContext.Response.Headers["x-file-name"] = _filename; context.HttpContext.Response.Headers[HeaderNames.ContentType] = _contentType; context.HttpContext.Response.Headers[HeaderNames.ContentLength] = _contentFile.Length.ToString(provider: default); context.HttpContext.Response.Headers[HeaderNames.ContentDisposition] = $"{System.Net.Mime.DispositionTypeNames.Inline}; filename=\"{_filename}\";"; await context.HttpContext.Response.Body.WriteAsync(_contentFile, 0, _contentFile.Length).ConfigureAwait(false); } private string GetContentType(string fileName) { var provider = new FileExtensionContentTypeProvider(); if (!provider.TryGetContentType(fileName, out string contentType)) contentType = "application/octet-stream"; return contentType; } }