From 05bfcf6555a5cdb1e436ceb0cc6335a8996fc8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Herceg?= Date: Sun, 21 Mar 2021 20:02:59 +0100 Subject: [PATCH 1/4] IUploadedFileStorage and IReturnedFileStorage made async --- .../Hosting/DotvvmRequestContextExtensions.cs | 2 +- .../Middlewares/DotvvmFileUploadMiddleware.cs | 2 +- .../DotvvmReturnedFileMiddleware.cs | 22 +++++++++--------- .../Storage/FileSystemReturnedFileStorage.cs | 14 +++++++---- .../Storage/FileSystemUploadedFileStorage.cs | 12 ++++++---- .../Storage/IReturnedFileStorage.cs | 12 ++++------ .../Storage/IUploadedFileStorage.cs | 16 +++++-------- src/DotVVM.Framework/Storage/ReturnedFile.cs | 23 +++++++++++++++++++ .../Storage/UploadedFileStorageExtensions.cs | 9 ++++---- .../FileUpload/FileUploadViewModel.cs | 6 ++--- 10 files changed, 70 insertions(+), 48 deletions(-) create mode 100644 src/DotVVM.Framework/Storage/ReturnedFile.cs diff --git a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs index ba2f899f6d..34694a63b5 100644 --- a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs +++ b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs @@ -232,7 +232,7 @@ public static void ReturnFile(this IDotvvmRequestContext context, Stream stream, AttachmentDispositionType = attachmentDispositionType ?? "attachment" }; - var generatedFileId = returnedFileStorage.StoreFile(stream, metadata).Result; + var generatedFileId = returnedFileStorage.StoreFileAsync(stream, metadata).Result; context.SetRedirectResponse(context.TranslateVirtualPath("~/dotvvmReturnedFile?id=" + generatedFileId)); throw new DotvvmInterruptRequestExecutionException(InterruptReason.ReturnFile, fileName); } diff --git a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs index 8d9f654ba6..391a2a1017 100644 --- a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs +++ b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs @@ -176,7 +176,7 @@ private async Task SaveFiles(IHttpContext context, Group boundary, List private async Task StoreFile(IHttpContext context, MultipartSection section, IUploadedFileStorage fileStore) { - var fileId = await fileStore.StoreFile(section.Body); + var fileId = await fileStore.StoreFileAsync(section.Body); var fileNameGroup = Regex.Match(section.ContentDisposition, @"filename=""?(?[^\""]*)", RegexOptions.IgnoreCase).Groups["fileName"]; var fileName = fileNameGroup.Success ? fileNameGroup.Value : string.Empty; var mimeType = section.ContentType ?? string.Empty; diff --git a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs index 4495a4c08a..5d6600d35b 100644 --- a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs +++ b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs @@ -30,27 +30,27 @@ public async Task Handle(IDotvvmRequestContext request) private async Task RenderReturnedFile(IHttpContext context, IReturnedFileStorage returnedFileStorage) { - ReturnedFileMetadata metadata; - var id = Guid.Parse(context.Request.Query["id"]); - using (var stream = returnedFileStorage.GetFile(id, out metadata)) + + var returnedFile = await returnedFileStorage.GetFileAsync(id); + using (var stream = returnedFile.Stream) { #if DotNetCore - var contentDispositionValue = new ContentDispositionHeaderValue(metadata.AttachmentDispositionType); - contentDispositionValue.SetHttpFileName(metadata.FileName); + var contentDispositionValue = new ContentDispositionHeaderValue(returnedFile.Metadata.AttachmentDispositionType); + contentDispositionValue.SetHttpFileName(returnedFile.Metadata.FileName); context.Response.Headers[HeaderNames.ContentDisposition] = contentDispositionValue.ToString(); #else - var contentDispositionValue = new ContentDispositionHeaderValue(metadata.AttachmentDispositionType) + var contentDispositionValue = new ContentDispositionHeaderValue(returnedFile.Metadata.AttachmentDispositionType) { - FileName = metadata.FileName, - FileNameStar = metadata.FileName + FileName = returnedFile.Metadata.FileName, + FileNameStar = returnedFile.Metadata.FileName }; context.Response.Headers["Content-Disposition"] = contentDispositionValue.ToString(); #endif - context.Response.ContentType = metadata.MimeType; - if (metadata.AdditionalHeaders != null) + context.Response.ContentType = returnedFile.Metadata.MimeType; + if (returnedFile.Metadata.AdditionalHeaders != null) { - foreach (var header in metadata.AdditionalHeaders) + foreach (var header in returnedFile.Metadata.AdditionalHeaders) { context.Response.Headers.Add(new KeyValuePair(header.Key, header.Value)); } diff --git a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs index 994295087c..7eaf266f24 100644 --- a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs @@ -69,7 +69,7 @@ private Guid GenerateFileId() return SecureGuidGenerator.GenerateGuid(); } - public async Task StoreFile(Stream stream, ReturnedFileMetadata metadata) + public async Task StoreFileAsync(Stream stream, ReturnedFileMetadata metadata) { var id = GenerateFileId(); var dataFilePath = GetDataFilePath(id); @@ -99,16 +99,18 @@ private string GetMetadataFilePath(Guid id) return Path.Combine(TempDirectory, id + ".metadata"); } - public Stream GetFile(Guid id, out ReturnedFileMetadata metadata) + public Task GetFileAsync(Guid id) { var metadataJson = File.ReadAllText(GetMetadataFilePath(id), Encoding.UTF8); var settings = DefaultSerializerSettingsProvider.Instance.Settings; - metadata = JsonConvert.DeserializeObject(metadataJson, settings); - return new FileStream(GetDataFilePath(id), FileMode.Open); + var stream = new FileStream(GetDataFilePath(id), FileMode.Open); + var metadata = JsonConvert.DeserializeObject(metadataJson, settings); + + return Task.FromResult(new ReturnedFile(stream, metadata)); } - public void DeleteFile(Guid id) + public Task DeleteFileAsync(Guid id) { try { @@ -125,6 +127,8 @@ public void DeleteFile(Guid id) catch (IOException) { } + + return TaskUtils.GetCompletedTask(); } public void DeleteOldFiles(DateTime maxCreatedDate) diff --git a/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs b/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs index cedd80e4a0..020b125453 100644 --- a/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs @@ -37,7 +37,7 @@ public FileSystemUploadedFileStorage(string tempDirectory, TimeSpan autoDeleteIn /// /// Stores uploaded file and returns its unique id. /// - public async Task StoreFile(Stream stream) + public async Task StoreFileAsync(Stream stream) { var id = SecureGuidGenerator.GenerateGuid(); using (var fs = new FileStream(GetFileName(id), FileMode.OpenOrCreate, FileAccess.Write)) @@ -50,7 +50,7 @@ public async Task StoreFile(Stream stream) /// /// Deletes the uploaded file. /// - public void DeleteFile(Guid fileId) + public Task DeleteFileAsync(Guid fileId) { try { @@ -59,14 +59,16 @@ public void DeleteFile(Guid fileId) catch (IOException) { } + return TaskUtils.GetCompletedTask(); } /// /// Gets the file with the specified id. /// - public Stream GetFile(Guid fileId) + public Task GetFileAsync(Guid fileId) { - return new FileStream(GetFileName(fileId), FileMode.Open, FileAccess.Read); + var stream = new FileStream(GetFileName(fileId), FileMode.Open, FileAccess.Read); + return Task.FromResult(stream); } /// @@ -107,4 +109,4 @@ public void Dispose() } } } -} \ No newline at end of file +} diff --git a/src/DotVVM.Framework/Storage/IReturnedFileStorage.cs b/src/DotVVM.Framework/Storage/IReturnedFileStorage.cs index 8936d63aff..e89d3792a3 100644 --- a/src/DotVVM.Framework/Storage/IReturnedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/IReturnedFileStorage.cs @@ -9,21 +9,17 @@ public interface IReturnedFileStorage /// /// Stores the file and returns its unique ID. /// - Task StoreFile(Stream stream, ReturnedFileMetadata metadata); + Task StoreFileAsync(Stream stream, ReturnedFileMetadata metadata); /// /// Gets the file from the storage. /// - Stream GetFile(Guid fileId, out ReturnedFileMetadata metadata); + Task GetFileAsync(Guid fileId); /// /// Deletes the file with the specified ID. /// - void DeleteFile(Guid fileId); + Task DeleteFileAsync(Guid fileId); - /// - /// Deletes all files older than the specified date. - /// - void DeleteOldFiles(DateTime maxCreatedDate); } -} \ No newline at end of file +} diff --git a/src/DotVVM.Framework/Storage/IUploadedFileStorage.cs b/src/DotVVM.Framework/Storage/IUploadedFileStorage.cs index 426cd7057c..03d7123bc5 100644 --- a/src/DotVVM.Framework/Storage/IUploadedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/IUploadedFileStorage.cs @@ -9,21 +9,17 @@ public interface IUploadedFileStorage /// /// Stores uploaded file and returns its unique ID. /// - Task StoreFile(Stream stream); + Task StoreFileAsync(Stream stream); /// - /// Deletes the uploaded file. + /// Deletes the uploaded file with the specified ID. /// - void DeleteFile(Guid fileId); + Task DeleteFileAsync(Guid fileId); /// - /// Gets the file with the specified ID. + /// Gets the stream of the file with the specified ID. /// - Stream GetFile(Guid fileId); + Task GetFileAsync(Guid fileId); - /// - /// Deletes files older than the specified date. - /// - void DeleteOldFiles(DateTime maxCreatedDate); } -} \ No newline at end of file +} diff --git a/src/DotVVM.Framework/Storage/ReturnedFile.cs b/src/DotVVM.Framework/Storage/ReturnedFile.cs new file mode 100644 index 0000000000..23e16b12ec --- /dev/null +++ b/src/DotVVM.Framework/Storage/ReturnedFile.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DotVVM.Framework.Storage +{ + public class ReturnedFile + { + + public Stream Stream { get; } + public ReturnedFileMetadata Metadata { get; } + + public ReturnedFile(Stream stream, ReturnedFileMetadata metadata) + { + Stream = stream; + Metadata = metadata; + } + + } +} diff --git a/src/DotVVM.Framework/Storage/UploadedFileStorageExtensions.cs b/src/DotVVM.Framework/Storage/UploadedFileStorageExtensions.cs index edbe1cba13..c615d6a466 100644 --- a/src/DotVVM.Framework/Storage/UploadedFileStorageExtensions.cs +++ b/src/DotVVM.Framework/Storage/UploadedFileStorageExtensions.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading.Tasks; namespace DotVVM.Framework.Storage { @@ -8,15 +9,15 @@ public static class UploadedFileStorageExtensions /// /// Saves an uploaded file with the specified ID to the given location. /// - public static void SaveAs(this IUploadedFileStorage storage, Guid fileId, string path) + public static async Task SaveAsAsync(this IUploadedFileStorage storage, Guid fileId, string path) { - using (var stream = storage.GetFile(fileId)) + using (var stream = await storage.GetFileAsync(fileId)) { using (var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) { - stream.CopyTo(fs); + await stream.CopyToAsync(fs); } } } } -} \ No newline at end of file +} diff --git a/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs b/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs index f94def3289..42fc0ca69f 100644 --- a/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs +++ b/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs @@ -48,14 +48,14 @@ public void CheckFile() FileSize = file.FileSize; } - public void Process() + public async Task Process() { var uploadPath = GetUploadPath(); foreach (var file in Files.Files) { - fileStorage.SaveAs(file.FileId, Path.Combine(uploadPath, file.FileId + ".bin")); - fileStorage.DeleteFile(file.FileId); + await fileStorage.SaveAsAsync(file.FileId, Path.Combine(uploadPath, file.FileId + ".bin")); + await fileStorage.DeleteFileAsync(file.FileId); } Files.Clear(); } From e7e95e2d1f45c853b95ea6f3aba5b202c68fefcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Herceg?= Date: Sun, 21 Mar 2021 20:10:45 +0100 Subject: [PATCH 2/4] IUploadedFileStorage, IReturnedFileStorage and related classes moved to DotVVM.Core --- .../Storage/FileSize.cs | 6 +++--- .../Storage/IReturnedFileStorage.cs | 2 +- .../Storage/IUploadedFileStorage.cs | 2 +- .../Storage/ReturnedFile.cs | 2 +- src/DotVVM.Core/Storage/ReturnedFileMetadata.cs | 12 ++++++++++++ .../Storage/UploadedFile.cs | 6 +++--- .../Storage/UploadedFileStorageExtensions.cs | 2 +- .../Utils/TextUtils.cs | 4 +++- .../Controls/UploadedFilesCollection.cs | 2 +- .../DependencyInjection/DotvvmBuilderExtensions.cs | 1 + .../Hosting/DotvvmRequestContextExtensions.cs | 1 + .../Middlewares/DotvvmFileUploadMiddleware.cs | 2 +- .../Middlewares/DotvvmReturnedFileMiddleware.cs | 2 +- .../Storage/FileSystemReturnedFileStorage.cs | 1 + .../Storage/FileSystemUploadedFileStorage.cs | 1 + .../Storage/ReturnedFileMetadata.cs | 13 ------------- .../FileUpload/FileUploadViewModel.cs | 2 +- 17 files changed, 33 insertions(+), 28 deletions(-) rename src/{DotVVM.Framework => DotVVM.Core}/Storage/FileSize.cs (78%) rename src/{DotVVM.Framework => DotVVM.Core}/Storage/IReturnedFileStorage.cs (94%) rename src/{DotVVM.Framework => DotVVM.Core}/Storage/IUploadedFileStorage.cs (94%) rename src/{DotVVM.Framework => DotVVM.Core}/Storage/ReturnedFile.cs (92%) create mode 100644 src/DotVVM.Core/Storage/ReturnedFileMetadata.cs rename src/{DotVVM.Framework => DotVVM.Core}/Storage/UploadedFile.cs (82%) rename src/{DotVVM.Framework => DotVVM.Core}/Storage/UploadedFileStorageExtensions.cs (94%) rename src/{DotVVM.Framework => DotVVM.Core}/Utils/TextUtils.cs (93%) delete mode 100644 src/DotVVM.Framework/Storage/ReturnedFileMetadata.cs diff --git a/src/DotVVM.Framework/Storage/FileSize.cs b/src/DotVVM.Core/Storage/FileSize.cs similarity index 78% rename from src/DotVVM.Framework/Storage/FileSize.cs rename to src/DotVVM.Core/Storage/FileSize.cs index 33eb6f0d95..8f545e1a57 100644 --- a/src/DotVVM.Framework/Storage/FileSize.cs +++ b/src/DotVVM.Core/Storage/FileSize.cs @@ -1,6 +1,6 @@ -using DotVVM.Framework.Utils; +using DotVVM.Core.Utils; -namespace DotVVM.Framework.Storage +namespace DotVVM.Core.Storage { public class FileSize { @@ -13,4 +13,4 @@ public override string ToString() return FormattedText; } } -} \ No newline at end of file +} diff --git a/src/DotVVM.Framework/Storage/IReturnedFileStorage.cs b/src/DotVVM.Core/Storage/IReturnedFileStorage.cs similarity index 94% rename from src/DotVVM.Framework/Storage/IReturnedFileStorage.cs rename to src/DotVVM.Core/Storage/IReturnedFileStorage.cs index e89d3792a3..aab2d168e4 100644 --- a/src/DotVVM.Framework/Storage/IReturnedFileStorage.cs +++ b/src/DotVVM.Core/Storage/IReturnedFileStorage.cs @@ -2,7 +2,7 @@ using System.IO; using System.Threading.Tasks; -namespace DotVVM.Framework.Storage +namespace DotVVM.Core.Storage { public interface IReturnedFileStorage { diff --git a/src/DotVVM.Framework/Storage/IUploadedFileStorage.cs b/src/DotVVM.Core/Storage/IUploadedFileStorage.cs similarity index 94% rename from src/DotVVM.Framework/Storage/IUploadedFileStorage.cs rename to src/DotVVM.Core/Storage/IUploadedFileStorage.cs index 03d7123bc5..8c4e4b83f7 100644 --- a/src/DotVVM.Framework/Storage/IUploadedFileStorage.cs +++ b/src/DotVVM.Core/Storage/IUploadedFileStorage.cs @@ -2,7 +2,7 @@ using System.IO; using System.Threading.Tasks; -namespace DotVVM.Framework.Storage +namespace DotVVM.Core.Storage { public interface IUploadedFileStorage { diff --git a/src/DotVVM.Framework/Storage/ReturnedFile.cs b/src/DotVVM.Core/Storage/ReturnedFile.cs similarity index 92% rename from src/DotVVM.Framework/Storage/ReturnedFile.cs rename to src/DotVVM.Core/Storage/ReturnedFile.cs index 23e16b12ec..f3e509f5e3 100644 --- a/src/DotVVM.Framework/Storage/ReturnedFile.cs +++ b/src/DotVVM.Core/Storage/ReturnedFile.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; -namespace DotVVM.Framework.Storage +namespace DotVVM.Core.Storage { public class ReturnedFile { diff --git a/src/DotVVM.Core/Storage/ReturnedFileMetadata.cs b/src/DotVVM.Core/Storage/ReturnedFileMetadata.cs new file mode 100644 index 0000000000..70a7788c77 --- /dev/null +++ b/src/DotVVM.Core/Storage/ReturnedFileMetadata.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace DotVVM.Core.Storage +{ + public class ReturnedFileMetadata + { + public string? FileName { get; set; } + public string? MimeType { get; set; } + public Dictionary AdditionalHeaders { get; set; } = new Dictionary(); + public string? AttachmentDispositionType { get; set; } + } +} diff --git a/src/DotVVM.Framework/Storage/UploadedFile.cs b/src/DotVVM.Core/Storage/UploadedFile.cs similarity index 82% rename from src/DotVVM.Framework/Storage/UploadedFile.cs rename to src/DotVVM.Core/Storage/UploadedFile.cs index d958382143..962dfc4e40 100644 --- a/src/DotVVM.Framework/Storage/UploadedFile.cs +++ b/src/DotVVM.Core/Storage/UploadedFile.cs @@ -1,12 +1,12 @@ using System; -namespace DotVVM.Framework.Storage +namespace DotVVM.Core.Storage { public class UploadedFile { public Guid FileId { get; set; } - public string FileName { get; set; } + public string? FileName { get; set; } public FileSize FileSize { get; set; } = new FileSize(); @@ -17,4 +17,4 @@ public class UploadedFile public bool IsAllowed => IsFileTypeAllowed && !IsMaxSizeExceeded; } -} \ No newline at end of file +} diff --git a/src/DotVVM.Framework/Storage/UploadedFileStorageExtensions.cs b/src/DotVVM.Core/Storage/UploadedFileStorageExtensions.cs similarity index 94% rename from src/DotVVM.Framework/Storage/UploadedFileStorageExtensions.cs rename to src/DotVVM.Core/Storage/UploadedFileStorageExtensions.cs index c615d6a466..e4ebaf41eb 100644 --- a/src/DotVVM.Framework/Storage/UploadedFileStorageExtensions.cs +++ b/src/DotVVM.Core/Storage/UploadedFileStorageExtensions.cs @@ -2,7 +2,7 @@ using System.IO; using System.Threading.Tasks; -namespace DotVVM.Framework.Storage +namespace DotVVM.Core.Storage { public static class UploadedFileStorageExtensions { diff --git a/src/DotVVM.Framework/Utils/TextUtils.cs b/src/DotVVM.Core/Utils/TextUtils.cs similarity index 93% rename from src/DotVVM.Framework/Utils/TextUtils.cs rename to src/DotVVM.Core/Utils/TextUtils.cs index f54b1fe77e..ad461b8091 100644 --- a/src/DotVVM.Framework/Utils/TextUtils.cs +++ b/src/DotVVM.Core/Utils/TextUtils.cs @@ -1,5 +1,7 @@ #nullable enable -namespace DotVVM.Framework.Utils +using DotVVM; + +namespace DotVVM.Core.Utils { public static class TextUtils { diff --git a/src/DotVVM.Framework/Controls/UploadedFilesCollection.cs b/src/DotVVM.Framework/Controls/UploadedFilesCollection.cs index 3509ac2ce3..dbac76afb0 100644 --- a/src/DotVVM.Framework/Controls/UploadedFilesCollection.cs +++ b/src/DotVVM.Framework/Controls/UploadedFilesCollection.cs @@ -1,6 +1,6 @@ #nullable enable using System.Collections.Generic; -using DotVVM.Framework.Storage; +using DotVVM.Core.Storage; namespace DotVVM.Framework.Controls { diff --git a/src/DotVVM.Framework/DependencyInjection/DotvvmBuilderExtensions.cs b/src/DotVVM.Framework/DependencyInjection/DotvvmBuilderExtensions.cs index 5771ee660b..0fb2b743d2 100644 --- a/src/DotVVM.Framework/DependencyInjection/DotvvmBuilderExtensions.cs +++ b/src/DotVVM.Framework/DependencyInjection/DotvvmBuilderExtensions.cs @@ -1,6 +1,7 @@ #nullable enable using System; using System.IO; +using DotVVM.Core.Storage; using DotVVM.Framework.Configuration; using DotVVM.Framework.Diagnostics; using DotVVM.Framework.Runtime; diff --git a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs index 34694a63b5..68f622e540 100644 --- a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs +++ b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs @@ -17,6 +17,7 @@ using System.Threading.Tasks; using DotVVM.Framework.Routing; using DotVVM.Framework.Hosting; +using DotVVM.Core.Storage; public static class DotvvmRequestContextExtensions { diff --git a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs index 391a2a1017..8091f18be8 100644 --- a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs +++ b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmFileUploadMiddleware.cs @@ -6,10 +6,10 @@ using System.Net; using System.Text.RegularExpressions; using System.Threading.Tasks; +using DotVVM.Core.Storage; using DotVVM.Framework.Configuration; using DotVVM.Framework.Controls; using DotVVM.Framework.Runtime; -using DotVVM.Framework.Storage; using DotVVM.Framework.ViewModel.Serialization; using Microsoft.AspNet.WebUtilities; using Microsoft.Extensions.DependencyInjection; diff --git a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs index 5d6600d35b..b3c8c5c069 100644 --- a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs +++ b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs @@ -3,9 +3,9 @@ using System.Linq; using System.Net; using System.Threading.Tasks; -using DotVVM.Framework.Storage; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; +using DotVVM.Core.Storage; #if DotNetCore using Microsoft.Net.Http.Headers; #else diff --git a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs index 7eaf266f24..4eaa81d2f7 100644 --- a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs @@ -7,6 +7,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using DotVVM.Core.Storage; using DotVVM.Framework.Configuration; using DotVVM.Framework.Utils; using Newtonsoft.Json; diff --git a/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs b/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs index 020b125453..5ed934153a 100644 --- a/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/FileSystemUploadedFileStorage.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using DotVVM.Core.Storage; using DotVVM.Framework.Utils; namespace DotVVM.Framework.Storage diff --git a/src/DotVVM.Framework/Storage/ReturnedFileMetadata.cs b/src/DotVVM.Framework/Storage/ReturnedFileMetadata.cs deleted file mode 100644 index 5285816a52..0000000000 --- a/src/DotVVM.Framework/Storage/ReturnedFileMetadata.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; - -namespace DotVVM.Framework.Storage -{ - public class ReturnedFileMetadata - { - public string FileName { get; set; } - public string MimeType { get; set; } - public Dictionary AdditionalHeaders { get; set; } - public string AttachmentDispositionType { get; set; } - } -} diff --git a/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs b/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs index 42fc0ca69f..b48c57b4c6 100644 --- a/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs +++ b/src/DotVVM.Samples.Common/ViewModels/ControlSamples/FileUpload/FileUploadViewModel.cs @@ -3,8 +3,8 @@ using System.IO; using System.Linq; using System.Threading.Tasks; +using DotVVM.Core.Storage; using DotVVM.Framework.Controls; -using DotVVM.Framework.Storage; using DotVVM.Framework.ViewModel; namespace DotVVM.Samples.BasicSamples.ViewModels.ControlSamples.FileUpload From a7c61418ab87e68f2e8e3889a926041e96c7949b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20=C5=A0est=C3=A1k?= Date: Wed, 24 Mar 2021 14:35:38 +0100 Subject: [PATCH 3/4] Removed suffix Asnyc from IReturnedFileStorage --- src/DotVVM.Core/Storage/IReturnedFileStorage.cs | 6 +++--- .../Hosting/DotvvmRequestContextExtensions.cs | 6 +++--- .../Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs | 2 +- .../Storage/FileSystemReturnedFileStorage.cs | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/DotVVM.Core/Storage/IReturnedFileStorage.cs b/src/DotVVM.Core/Storage/IReturnedFileStorage.cs index aab2d168e4..4603bb3f74 100644 --- a/src/DotVVM.Core/Storage/IReturnedFileStorage.cs +++ b/src/DotVVM.Core/Storage/IReturnedFileStorage.cs @@ -9,17 +9,17 @@ public interface IReturnedFileStorage /// /// Stores the file and returns its unique ID. /// - Task StoreFileAsync(Stream stream, ReturnedFileMetadata metadata); + Task StoreFile(Stream stream, ReturnedFileMetadata metadata); /// /// Gets the file from the storage. /// - Task GetFileAsync(Guid fileId); + Task GetFile(Guid fileId); /// /// Deletes the file with the specified ID. /// - Task DeleteFileAsync(Guid fileId); + Task DeleteFile(Guid fileId); } } diff --git a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs index 68f622e540..f5e1625b47 100644 --- a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs +++ b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs @@ -209,13 +209,13 @@ public static string TranslateVirtualPath(string virtualUrl, IHttpContext httpCo /// /// Redirects the client to the specified file. /// - public static void ReturnFile(this IDotvvmRequestContext context, byte[] bytes, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) => + public static Task ReturnFile(this IDotvvmRequestContext context, byte[] bytes, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) => context.ReturnFile(new MemoryStream(bytes), fileName, mimeType, additionalHeaders, attachmentDispositionType); /// /// Redirects the client to the specified file. /// - public static void ReturnFile(this IDotvvmRequestContext context, Stream stream, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) + public static async Task ReturnFile(this IDotvvmRequestContext context, Stream stream, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) { var returnedFileStorage = context.Services.GetService(); @@ -233,7 +233,7 @@ public static void ReturnFile(this IDotvvmRequestContext context, Stream stream, AttachmentDispositionType = attachmentDispositionType ?? "attachment" }; - var generatedFileId = returnedFileStorage.StoreFileAsync(stream, metadata).Result; + var generatedFileId = await returnedFileStorage.StoreFile(stream, metadata); context.SetRedirectResponse(context.TranslateVirtualPath("~/dotvvmReturnedFile?id=" + generatedFileId)); throw new DotvvmInterruptRequestExecutionException(InterruptReason.ReturnFile, fileName); } diff --git a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs index b3c8c5c069..dc43a52e11 100644 --- a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs +++ b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs @@ -32,7 +32,7 @@ private async Task RenderReturnedFile(IHttpContext context, IReturnedFileStorage { var id = Guid.Parse(context.Request.Query["id"]); - var returnedFile = await returnedFileStorage.GetFileAsync(id); + var returnedFile = await returnedFileStorage.GetFile(id); using (var stream = returnedFile.Stream) { #if DotNetCore diff --git a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs index 4eaa81d2f7..2633717701 100644 --- a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs @@ -70,7 +70,7 @@ private Guid GenerateFileId() return SecureGuidGenerator.GenerateGuid(); } - public async Task StoreFileAsync(Stream stream, ReturnedFileMetadata metadata) + public async Task StoreFile(Stream stream, ReturnedFileMetadata metadata) { var id = GenerateFileId(); var dataFilePath = GetDataFilePath(id); @@ -100,7 +100,7 @@ private string GetMetadataFilePath(Guid id) return Path.Combine(TempDirectory, id + ".metadata"); } - public Task GetFileAsync(Guid id) + public Task GetFile(Guid id) { var metadataJson = File.ReadAllText(GetMetadataFilePath(id), Encoding.UTF8); var settings = DefaultSerializerSettingsProvider.Instance.Settings; @@ -111,7 +111,7 @@ public Task GetFileAsync(Guid id) return Task.FromResult(new ReturnedFile(stream, metadata)); } - public Task DeleteFileAsync(Guid id) + public Task DeleteFile(Guid id) { try { From 9108edf42f2139cd316476417dc852bfc44f215b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20=C5=A0est=C3=A1k?= Date: Thu, 25 Mar 2021 16:52:50 +0100 Subject: [PATCH 4/4] Revert "Removed suffix Asnyc from IReturnedFileStorage" This reverts commit a7c61418ab87e68f2e8e3889a926041e96c7949b. --- src/DotVVM.Core/Storage/IReturnedFileStorage.cs | 6 +++--- .../Hosting/DotvvmRequestContextExtensions.cs | 6 +++--- .../Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs | 2 +- .../Storage/FileSystemReturnedFileStorage.cs | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/DotVVM.Core/Storage/IReturnedFileStorage.cs b/src/DotVVM.Core/Storage/IReturnedFileStorage.cs index 4603bb3f74..aab2d168e4 100644 --- a/src/DotVVM.Core/Storage/IReturnedFileStorage.cs +++ b/src/DotVVM.Core/Storage/IReturnedFileStorage.cs @@ -9,17 +9,17 @@ public interface IReturnedFileStorage /// /// Stores the file and returns its unique ID. /// - Task StoreFile(Stream stream, ReturnedFileMetadata metadata); + Task StoreFileAsync(Stream stream, ReturnedFileMetadata metadata); /// /// Gets the file from the storage. /// - Task GetFile(Guid fileId); + Task GetFileAsync(Guid fileId); /// /// Deletes the file with the specified ID. /// - Task DeleteFile(Guid fileId); + Task DeleteFileAsync(Guid fileId); } } diff --git a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs index f5e1625b47..68f622e540 100644 --- a/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs +++ b/src/DotVVM.Framework/Hosting/DotvvmRequestContextExtensions.cs @@ -209,13 +209,13 @@ public static string TranslateVirtualPath(string virtualUrl, IHttpContext httpCo /// /// Redirects the client to the specified file. /// - public static Task ReturnFile(this IDotvvmRequestContext context, byte[] bytes, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) => + public static void ReturnFile(this IDotvvmRequestContext context, byte[] bytes, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) => context.ReturnFile(new MemoryStream(bytes), fileName, mimeType, additionalHeaders, attachmentDispositionType); /// /// Redirects the client to the specified file. /// - public static async Task ReturnFile(this IDotvvmRequestContext context, Stream stream, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) + public static void ReturnFile(this IDotvvmRequestContext context, Stream stream, string fileName, string mimeType, IEnumerable>? additionalHeaders = null, string? attachmentDispositionType = null) { var returnedFileStorage = context.Services.GetService(); @@ -233,7 +233,7 @@ public static async Task ReturnFile(this IDotvvmRequestContext context, Stream s AttachmentDispositionType = attachmentDispositionType ?? "attachment" }; - var generatedFileId = await returnedFileStorage.StoreFile(stream, metadata); + var generatedFileId = returnedFileStorage.StoreFileAsync(stream, metadata).Result; context.SetRedirectResponse(context.TranslateVirtualPath("~/dotvvmReturnedFile?id=" + generatedFileId)); throw new DotvvmInterruptRequestExecutionException(InterruptReason.ReturnFile, fileName); } diff --git a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs index dc43a52e11..b3c8c5c069 100644 --- a/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs +++ b/src/DotVVM.Framework/Hosting/Middlewares/DotvvmReturnedFileMiddleware.cs @@ -32,7 +32,7 @@ private async Task RenderReturnedFile(IHttpContext context, IReturnedFileStorage { var id = Guid.Parse(context.Request.Query["id"]); - var returnedFile = await returnedFileStorage.GetFile(id); + var returnedFile = await returnedFileStorage.GetFileAsync(id); using (var stream = returnedFile.Stream) { #if DotNetCore diff --git a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs index 2633717701..4eaa81d2f7 100644 --- a/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs +++ b/src/DotVVM.Framework/Storage/FileSystemReturnedFileStorage.cs @@ -70,7 +70,7 @@ private Guid GenerateFileId() return SecureGuidGenerator.GenerateGuid(); } - public async Task StoreFile(Stream stream, ReturnedFileMetadata metadata) + public async Task StoreFileAsync(Stream stream, ReturnedFileMetadata metadata) { var id = GenerateFileId(); var dataFilePath = GetDataFilePath(id); @@ -100,7 +100,7 @@ private string GetMetadataFilePath(Guid id) return Path.Combine(TempDirectory, id + ".metadata"); } - public Task GetFile(Guid id) + public Task GetFileAsync(Guid id) { var metadataJson = File.ReadAllText(GetMetadataFilePath(id), Encoding.UTF8); var settings = DefaultSerializerSettingsProvider.Instance.Settings; @@ -111,7 +111,7 @@ public Task GetFile(Guid id) return Task.FromResult(new ReturnedFile(stream, metadata)); } - public Task DeleteFile(Guid id) + public Task DeleteFileAsync(Guid id) { try {