diff --git a/FrontApp/Pages/SubirArchivo.razor b/FrontApp/Pages/SubirArchivo.razor index 67fdcff..40f5ad4 100644 --- a/FrontApp/Pages/SubirArchivo.razor +++ b/FrontApp/Pages/SubirArchivo.razor @@ -7,41 +7,110 @@ Subir Archivo - NubeCasera - -

Subir Archivo

-
-@*
-
Seleccionar Archivo:
- -
*@ - + +
- + + + +
+@if (archivosSeleccionados != null && archivosSeleccionados.Count > 0) +{ +
+ Archivos Seleccionados: @archivosSeleccionados.Count + +
+ + +} + +@if (subiendoArchivo) +{ +
+
+ @progresoActual% +
+
+} @code { [Parameter] public Guid? CategoriaId { get; set; } - // este codigo, recibe 1 IFormFile por request, se enfoca en el loop - // se puede optimizar modificando o creando un endpoint recibiendo - // List. - public async Task SubirArchivoMetodo(InputFileChangeEventArgs e) + // Variables para la barra de progreso + private int progresoActual = 0; + private bool subiendoArchivo = false; + + // variable para guardar los archivos seleccionados + private IReadOnlyList? archivosSeleccionados; + + // obtiene los archivos seleccionados y los guarda en la variable archivosSeleccionados + private void ArchivosSeleccionados(InputFileChangeEventArgs e) + { + archivosSeleccionados = e.GetMultipleFiles(); + } + + public async Task SubirArchivos() { - var archivos = e.GetMultipleFiles(); + if (archivosSeleccionados == null || archivosSeleccionados.Count == 0)return; const long MaxFileSize = 5L * 1024L * 1024L * 1024L; - foreach (var archivo in archivos) + // Mostrar la barra de progreso + subiendoArchivo = true; + progresoActual = 0; + + try + { + foreach (var archivo in archivosSeleccionados) + { + await ArchivoService.SubirArchivoAsync( + archivo, + CategoriaId ?? Guid.Empty, + MaxFileSize, + (porcentaje) => + { + progresoActual = porcentaje; + StateHasChanged(); // Actualizar la UI + } + ); + } + } + catch (Exception ex) + { + // Manejar errores (por ejemplo, mostrar un mensaje) + Console.WriteLine($"Error: {ex.Message}"); + } + finally { - await using var stream = archivo.OpenReadStream(maxAllowedSize: MaxFileSize); - // IBrowserFile file, Guid IdCategoria, long maxAllowedSize - await ArchivoService.SubirArchivoAsync(archivo, CategoriaId ?? Guid.Empty, MaxFileSize); + // Ocultar la barra al terminar (éxito o error) + subiendoArchivo = false; + progresoActual = 0; } - Navigation.NavigateTo("/archivos"); - } } \ No newline at end of file diff --git a/FrontApp/Servicios/ArchivoService.cs b/FrontApp/Servicios/ArchivoService.cs index bde4554..771cba2 100644 --- a/FrontApp/Servicios/ArchivoService.cs +++ b/FrontApp/Servicios/ArchivoService.cs @@ -10,11 +10,16 @@ namespace Front.Servicios public class ArchivoService : IArchivoService { private readonly HttpClient _httpClient; + + //public Action? OnProgresoActualizado; + public ArchivoService(HttpClient httpClient) { _httpClient = httpClient; } + + public async Task> ObtenerArchivosAsync(Guid? categoriaId = null) { var url = categoriaId.HasValue @@ -38,8 +43,8 @@ public async Task EliminarArchivoAsync(Guid id) response.EnsureSuccessStatusCode(); } - #region working on! - public async Task SubirArchivoAsync(IBrowserFile file, Guid IdCategoria, long maxAllowedSize) + + public async Task SubirArchivoAsync(IBrowserFile file, Guid IdCategoria, long maxAllowedSize, Action OnProgresoActualizado) { const int chunkSize = 4 * 1024 * 1024; // 4 MB por chunk var IdSubida = Guid.NewGuid().ToString(); @@ -78,6 +83,10 @@ public async Task SubirArchivoAsync(IBrowserFile file, Guid IdCategoria, long ma // importante: pedir que el browser use streaming si esta disponible req.SetBrowserRequestStreamingEnabled(true); + // porcentaje de carga de chunks, para actualizar la barra de progreso + int porcentaje = (int)((chunkIndex + 1) * 100.0 / chunksTotales); + OnProgresoActualizado?.Invoke(porcentaje); + using var resp = await _httpClient.SendAsync(req, HttpCompletionOption.ResponseHeadersRead); resp.EnsureSuccessStatusCode(); chunkIndex++; @@ -85,7 +94,7 @@ public async Task SubirArchivoAsync(IBrowserFile file, Guid IdCategoria, long ma } - #endregion + public string ObtenerUrlDescarga(Guid id) { diff --git a/FrontApp/Servicios/IArchivoService.cs b/FrontApp/Servicios/IArchivoService.cs index d0edba0..97d7713 100644 --- a/FrontApp/Servicios/IArchivoService.cs +++ b/FrontApp/Servicios/IArchivoService.cs @@ -5,7 +5,7 @@ namespace Front.Servicios { public interface IArchivoService { - Task SubirArchivoAsync(IBrowserFile file, Guid IdCategoria, long maxAllowedSize); + Task SubirArchivoAsync(IBrowserFile file, Guid IdCategoria, long maxAllowedSize, Action OnProgresoActualizado); Task> ObtenerArchivosAsync(Guid? categoriaId = null); Task ObtenerArchivoAsync(Guid id); Task> BuscarArchivosAsync(string? q, Guid? categoriaId = null);