summaryrefslogtreecommitdiffstats
path: root/BlobBin/Program.cs
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2023-01-13 00:04:12 +0100
committerivarlovlie <git@ivarlovlie.no>2023-01-13 00:04:12 +0100
commit971c00b8f5977db9422eeafa47b262c1030bd4af (patch)
tree09ec55186f0f85d983b3be1754c6393123bc4363 /BlobBin/Program.cs
parenta9860b28f2be123d1f0bfad504165992a4c841ed (diff)
downloadblob-bin-971c00b8f5977db9422eeafa47b262c1030bd4af.tar.xz
blob-bin-971c00b8f5977db9422eeafa47b262c1030bd4af.zip
feat: working file upload
Diffstat (limited to 'BlobBin/Program.cs')
-rw-r--r--BlobBin/Program.cs76
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