diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2023-01-13 00:04:12 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2023-01-13 00:04:12 +0100 |
| commit | 971c00b8f5977db9422eeafa47b262c1030bd4af (patch) | |
| tree | 09ec55186f0f85d983b3be1754c6393123bc4363 /BlobBin/Program.cs | |
| parent | a9860b28f2be123d1f0bfad504165992a4c841ed (diff) | |
| download | blob-bin-971c00b8f5977db9422eeafa47b262c1030bd4af.tar.xz blob-bin-971c00b8f5977db9422eeafa47b262c1030bd4af.zip | |
feat: working file upload
Diffstat (limited to 'BlobBin/Program.cs')
| -rw-r--r-- | BlobBin/Program.cs | 76 |
1 files changed, 71 insertions, 5 deletions
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<IResult> 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<IResult> 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 |
