diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index 361bffbd..2146ead7 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -329,27 +329,29 @@ var folder = (Folder == Constants.PackagesFolder) ? Folder : FolderId.ToString(); await interop.UploadFiles(posturl, folder, _guid, SiteState.AntiForgeryToken); - // uploading is asynchronous so we need to wait for the uploads to complete - // note that this will only wait a maximum of 15 seconds which may not be long enough for very large file uploads - bool success = false; - int attempts = 0; - while (attempts < 5 && !success) + // uploading is asynchronous so we need to poll to determine if uploads are completed + var success = true; + int upload = 0; + while (upload < uploads.Length && success) { - attempts += 1; - Thread.Sleep(1000 * attempts); // progressive retry - - success = true; - List files = await FileService.GetFilesAsync(folder); - if (files.Count > 0) + success = false; + // note that progressive retry will only wait a maximum of 15 seconds which may not be long enough for very large file uploads + int attempts = 0; + while (attempts < 5 && !success) { - foreach (string upload in uploads) + attempts += 1; + Thread.Sleep(1000 * attempts); // progressive retry + + var file = await FileService.GetFileAsync(int.Parse(folder), uploads[upload]); + if (file != null) { - if (!files.Exists(item => item.Name == upload)) - { - success = false; - } + success = true; } } + if (success) + { + upload++; + } } // reset progress indicators @@ -379,14 +381,14 @@ else { // set FileId to first file in upload collection - await GetFiles(); - var file = _files.Where(item => item.Name == uploads[0]).FirstOrDefault(); + var file = await FileService.GetFileAsync(int.Parse(folder), uploads[0]); if (file != null) { FileId = file.FileId; await SetImage(); await OnUpload.InvokeAsync(FileId); } + await GetFiles(); StateHasChanged(); } } diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index 63f0366b..62b018e5 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -139,9 +139,13 @@ namespace Oqtane.Controllers } else { - _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized File Get Attempt {Name} For Folder {FolderId}", name, folderId); - HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; - return null; + if (file != null) + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized File Get Attempt {Name} For Folder {FolderId}", name, folderId); + HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; + file = null; + } + return file; } }