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");
app.MapMethods(
"/api/thumbnails/{id:int}",
["GET", "HEAD"],
async (int id, IThumbnailStreamService thumbnailStreamService, HttpContext httpContext) =>
{
var thumbnail = await thumbnailStreamService.GetThumbnailAsync(id);
if (thumbnail is null)
{
return Results.NotFound();
}
var stream = System.IO.File.Open(
thumbnail.FilePath,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite);
httpContext.Response.Headers.ContentDisposition =
$"inline; filename=\"{Uri.EscapeDataString(thumbnail.FileName)}\"";
httpContext.Response.Headers.CacheControl = "public, max-age=3600";
return Results.File(
stream,
contentType: thumbnail.ContentType,
lastModified: thumbnail.LastModified);
})
.WithName("StreamManagedThumbnailById")
.WithTags("FileLibrary");
return app;
}
}
}