@page "/storage"
@inject HttpClient Http
@using System.Net.Http.Json
@using Pldpro.Web.Models
Storage
S3 Storage
Buckets
Erstellen
@if (buckets is null)
{
(lädt...)
}
else if (!buckets.Any())
{
(keine Buckets)
}
else
{
@foreach (var b in buckets)
{
@b.Name
}
}
@if (!string.IsNullOrEmpty(selectedBucket))
{
Objekte in '@selectedBucket'
Key
Größe
Geändert
@context.Key
@context.Size
@context.LastModified
}
@code {
private record BucketVm(string Name, DateTime? CreationDate);
private record ObjectVm(string Key, long? Size, DateTime? LastModified);
private List? buckets;
private List? objects;
private string? selectedBucket;
private string newBucketName = "";
private const long StreamLimit = 512L * 1024 * 1024; // 512 MB (Program.cs erhöht Multipart-Limit)
protected override async Task OnInitializedAsync()
=> await LoadBuckets();
private async Task LoadBuckets()
{
var data = await Http.GetFromJsonAsync>("/api/storage/buckets");
buckets = data ?? new();
StateHasChanged();
}
private async Task SelectBucket(string name)
{
selectedBucket = name;
objects = await Http.GetFromJsonAsync>($"/api/storage/buckets/{name}/objects") ?? new();
}
private async Task CreateBucket()
{
if (string.IsNullOrWhiteSpace(newBucketName)) return;
await Http.PostAsJsonAsync("/api/storage/buckets", new S3CreateBucketDto { BucketName = newBucketName! });
newBucketName = "";
await LoadBuckets();
}
private async Task OnFilesSelected(InputFileChangeEventArgs e)
{
if (string.IsNullOrEmpty(selectedBucket)) return;
foreach (var file in e.GetMultipleFiles())
{
using var stream = file.OpenReadStream(StreamLimit);
using var content = new MultipartFormDataContent();
content.Add(new StreamContent(stream), "file", file.Name);
var resp = await Http.PostAsync($"/api/storage/buckets/{selectedBucket}/upload", content);
resp.EnsureSuccessStatusCode();
}
// Refresh list
objects = await Http.GetFromJsonAsync>($"/api/storage/buckets/{selectedBucket}/objects") ?? new();
}
}