From ea55e81819654ffa02a6caf0f66cecea4e1ae905 Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:10:05 -0400 Subject: [PATCH] File upload example updates --- .../LazyBrowserFileStream.cs | 87 +++++++++++++++++++ .../Pages/file-uploads/FileUpload2.razor | 30 ++++--- .../LazyBrowserFileStream.cs | 83 ++++++++++++++++++ .../Pages/file-uploads/FileUpload2.razor | 21 +++-- .../LazyBrowserFileStream.cs | 83 ++++++++++++++++++ .../Pages/file-uploads/FileUpload2.razor | 21 +++-- .../Components/Pages/FileUpload2.razor | 10 +-- .../LazyBrowserFileStream.cs | 78 +++++++++++++++++ 8 files changed, 370 insertions(+), 43 deletions(-) create mode 100644 5.0/BlazorSample_Server/LazyBrowserFileStream.cs create mode 100644 6.0/BlazorSample_Server/LazyBrowserFileStream.cs create mode 100644 7.0/BlazorSample_Server/LazyBrowserFileStream.cs create mode 100644 8.0/BlazorSample_BlazorWebApp/LazyBrowserFileStream.cs diff --git a/5.0/BlazorSample_Server/LazyBrowserFileStream.cs b/5.0/BlazorSample_Server/LazyBrowserFileStream.cs new file mode 100644 index 000000000..f7aacc6db --- /dev/null +++ b/5.0/BlazorSample_Server/LazyBrowserFileStream.cs @@ -0,0 +1,87 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components.Forms; + +namespace BlazorSample; + +internal sealed class LazyBrowserFileStream : Stream +{ + private readonly IBrowserFile file; + private readonly int maxAllowedSize; + private Stream? underlyingStream; + private bool isDisposed; + + public override bool CanRead => true; + + public override bool CanSeek => false; + + public override bool CanWrite => false; + + public override long Length => file.Size; + + public override long Position + { + get => underlyingStream?.Position ?? 0; + set => throw new NotSupportedException(); + } + + public LazyBrowserFileStream(IBrowserFile file, int maxAllowedSize) + { + this.file = file; + this.maxAllowedSize = maxAllowedSize; + } + + public override void Flush() + { + underlyingStream?.Flush(); + } + + public override Task ReadAsync(byte[] buffer, int offset, int count, + CancellationToken cancellationToken) + { + EnsureStreamIsOpen(); + + return underlyingStream.ReadAsync(buffer, offset, count, cancellationToken); + } + + public override ValueTask ReadAsync(Memory buffer, + CancellationToken cancellationToken = default) + { + EnsureStreamIsOpen(); + return underlyingStream.ReadAsync(buffer, cancellationToken); + } + + [MemberNotNull(nameof(underlyingStream))] + private void EnsureStreamIsOpen() + { + underlyingStream ??= file.OpenReadStream(maxAllowedSize); + } + + protected override void Dispose(bool disposing) + { + if (isDisposed) + { + return; + } + + underlyingStream?.Dispose(); + isDisposed = true; + + base.Dispose(disposing); + } + + public override int Read(byte[] buffer, int offset, int count) + => throw new NotSupportedException(); + + public override long Seek(long offset, SeekOrigin origin) + => throw new NotSupportedException(); + + public override void SetLength(long value) + => throw new NotSupportedException(); + + public override void Write(byte[] buffer, int offset, int count) + => throw new NotSupportedException(); +} diff --git a/5.0/BlazorSample_Server/Pages/file-uploads/FileUpload2.razor b/5.0/BlazorSample_Server/Pages/file-uploads/FileUpload2.razor index 2eebec7e4..089439bd0 100644 --- a/5.0/BlazorSample_Server/Pages/file-uploads/FileUpload2.razor +++ b/5.0/BlazorSample_Server/Pages/file-uploads/FileUpload2.razor @@ -1,12 +1,17 @@ @page "/file-upload-2" -@using System.Linq @using System.Net.Http.Headers @using System.Text.Json @using Microsoft.Extensions.Logging @inject IHttpClientFactory ClientFactory @inject ILogger Logger -

Upload Files

+

File Upload Example 2

+ +

+ This example requires a backend server API to function. For more information, + see the Upload files to a server section + of the ASP.NET Core Blazor file uploads article. +

Upload Files

+

File Upload Example 2

+ +

+ This example requires a backend server API to function. For more information, + see the Upload files to a server section + of the ASP.NET Core Blazor file uploads article. +

Upload Files

+

File Upload Example 2

+ +

+ This example requires a backend server API to function. For more information, + see the Upload files to a server section + of the ASP.NET Core Blazor file uploads article. +