using FileShare_Services.Services.FileLibrary; namespace FileShare_API.Extensions { /// /// API-only raw file stream endpoints used by browser media elements. /// public static class FileStreamEndpointExtensions { /// /// Map the media URL emitted by . /// public static IEndpointRouteBuilder MapFileStreamEndpoints(this IEndpointRouteBuilder app) { app.MapMethods( "/api/files/{id:int}/stream", ["GET", "HEAD"], async (int id, IFileStreamService fileStreamService, HttpContext httpContext) => { var fileResponse = await fileStreamService.GetFileStreamAsync(id); if (fileResponse is null) { return Results.NotFound(); } var stream = System.IO.File.Open( fileResponse.FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); httpContext.Response.Headers.ContentDisposition = $"inline; filename=\"{Uri.EscapeDataString(fileResponse.FileName)}\""; httpContext.Response.Headers.AcceptRanges = "bytes"; httpContext.Response.Headers.CacheControl = "public, max-age=3600"; return Results.File( stream, contentType: fileResponse.ContentType, lastModified: fileResponse.LastModified, enableRangeProcessing: true); }) .WithName("StreamManagedFileById") .WithTags("FileLibrary"); return app; } } }