From 971c00b8f5977db9422eeafa47b262c1030bd4af Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Fri, 13 Jan 2023 00:04:12 +0100 Subject: feat: working file upload --- BlobBin/Program.cs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 5 deletions(-) (limited to 'BlobBin/Program.cs') diff --git a/BlobBin/Program.cs b/BlobBin/Program.cs index acf3e5f..e66cd02 100644 --- a/BlobBin/Program.cs +++ b/BlobBin/Program.cs @@ -1,4 +1,5 @@ global using BlobBin; +using IOL.Helpers; using Microsoft.EntityFrameworkCore; using File = BlobBin.File; @@ -9,7 +10,8 @@ var app = builder.Build(); app.UseFileServer(); app.UseStatusCodePages(); app.MapGet("/upload-link", GetUploadLink); -app.MapPost("/upload/{id}", GetUploadLink); +app.MapPost("/upload/{id}", UploadBig); +app.MapPost("/upload", UploadSimple); app.MapPost("/text", UploadText); app.MapGet("/b/{id}", GetBlob); app.Run(); @@ -20,10 +22,47 @@ IResult GetUploadLink(HttpContext context, DB db) { }; db.Files.Add(file); db.SaveChanges(); - return Results.Ok(context.Request.Host.Value + "/upload/" + file.Id); + return Results.Text( + context.Request.GetRequestHost() + + "/upload/" + + file.Id + ); } -IResult Upload(HttpContext context, DB db) { +async Task UploadSimple(HttpContext context, DB db) { + if (!context.Request.Form.Files.Any()) { + return Results.BadRequest("No files was found in request"); + } + + var file = new File { + CreatedBy = context.Request.Headers["X-Forwarded-For"].ToString(), + Singleton = context.Request.Form["singleton"] == "on", + AutoDeleteAfter = context.Request.Form["autoDeleteAfter"], + Length = context.Request.Form.Files[0].Length, + Name = context.Request.Form.Files[0].FileName, + MimeType = context.Request.Form.Files[0].ContentType, + PublicId = GetUnusedBlobId(db) + }; + + if (context.Request.Form["password"].ToString().HasValue()) { + file.PasswordHash = PasswordHelper.HashPassword(context.Request.Form["password"]); + } + + + await using var write = System.IO.File.OpenWrite( + Path.Combine(GetFilesDirectoryPath(), file.Id.ToString()) + ); + await context.Request.Form.Files[0].CopyToAsync(write); + db.Files.Add(file); + db.SaveChanges(); + return Results.Text( + context.Request.GetRequestHost() + + "/b/" + + file.PublicId + ); +} + +IResult UploadBig(HttpContext context, DB db) { return Results.Ok(); } @@ -31,8 +70,35 @@ IResult UploadText(HttpContext context, DB db) { return Results.Ok(); } -IResult GetBlob(string id) { - return Results.Ok(); +async Task GetBlob(string id, DB db) { + var file = db.Files.FirstOrDefault(c => c.PublicId == id.Trim()); + if (file == default) return Results.NotFound(); + var reader = await System.IO.File.ReadAllBytesAsync( + Path.Combine( + GetFilesDirectoryPath(), file.Id.ToString() + ) + ); + return Results.File(reader, file.MimeType, file.Name); +} + +string GetFilesDirectoryPath() { + var filesDirectoryPath = Path.Combine( + Directory.GetCurrentDirectory(), + "AppData", + "files" + ); + Directory.CreateDirectory(filesDirectoryPath); + return filesDirectoryPath; +} + +string GetUnusedBlobId(DB db) { + string id() => RandomString.Generate(5); + var res = id(); + while (db.Files.Any(c => c.PublicId == res)) { + res = id(); + } + + return res; } class BlobBase -- cgit v1.3