@page "/storage" @inject IHttpClientFactory HttpFactory @inject NavigationManager Nav @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) private HttpClient? Http; protected override Task OnInitializedAsync() { Http = HttpFactory.CreateClient(); Http.BaseAddress = new Uri(Nav.BaseUri); // für relative URLs wie "/api/storage/..." return 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(); } }