diff --git a/src/Blazor.FileReader/Blazor.FileReader.csproj b/src/Blazor.FileReader/Blazor.FileReader.csproj index f57609d..604c7d8 100644 --- a/src/Blazor.FileReader/Blazor.FileReader.csproj +++ b/src/Blazor.FileReader/Blazor.FileReader.csproj @@ -7,7 +7,6 @@ true latest false - 3.0.0.20340 Tor Knutsson (Tewr) https://github.com/Tewr/BlazorFileReader https://github.com/Tewr/BlazorFileReader @@ -15,14 +14,15 @@ blazor blazor-component stream filestream file-stream read-file filereader Debug;Release;Ghpages Tewr.Blazor.FileReader - Support for to 5, multi-targeting - 3.0.0.20340 + new APIs for .NET5: CreateObjectUrl, Expose Js file using JSObjectReference. MIT icon.png 3.0 Tewr.Blazor.FileReader Tewr.Blazor.FileReader - 3.0.0.20340 + 3.1.0.21158 + 3.1.0.21158 + 3.1.0.21158 diff --git a/src/Blazor.FileReader/FileReaderRef.cs b/src/Blazor.FileReader/FileReaderRef.cs index bc3de8e..20abaa6 100644 --- a/src/Blazor.FileReader/FileReaderRef.cs +++ b/src/Blazor.FileReader/FileReaderRef.cs @@ -60,6 +60,12 @@ public interface IFileReference /// /// Task GetJSObjectReferenceAsync(); + + /// + /// Returns an object url for a file. + /// + /// + Task GetObjectUrlAsync(); #endif /// @@ -296,6 +302,16 @@ public Task GetJSObjectReferenceAsync() { return this.fileLoaderRef.FileReaderJsInterop.GetJSObjectReferenceAsync(fileLoaderRef.ElementRef, this.index); } + + public async Task GetObjectUrlAsync() + { + var file = await GetJSObjectReferenceAsync(); + + var objectUrl = new ObjectUrl(this.fileLoaderRef.FileReaderJsInterop.CurrentJSRuntime, file); + await objectUrl.InitAsync(); + return objectUrl; + } + #endif } diff --git a/src/Blazor.FileReader/ObjectUrl.cs b/src/Blazor.FileReader/ObjectUrl.cs new file mode 100644 index 0000000..20e7493 --- /dev/null +++ b/src/Blazor.FileReader/ObjectUrl.cs @@ -0,0 +1,53 @@ +using Microsoft.JSInterop; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Tewr.Blazor.FileReader +{ +#if NET5 + + /// + /// Represents an object url for a file. + /// + /// https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL + public interface IObjectUrl : IAsyncDisposable + { + /// + /// Returns the Object Url. + /// + string Url => ToString(); + } + + internal class ObjectUrl : IObjectUrl + { + private string objectUrlDomString; + private readonly IJSRuntime jSRuntime; + private readonly IJSObjectReference file; + + internal ObjectUrl(IJSRuntime jSRuntime, IJSObjectReference file) + { + this.jSRuntime = jSRuntime; + this.file = file; + } + + public async ValueTask InitAsync() + { + this.objectUrlDomString = await jSRuntime.InvokeAsync("URL.createObjectURL", this.file); + } + + public async ValueTask DisposeAsync() + { + await jSRuntime.InvokeVoidAsync("URL.revokeObjectURL", this.file); + await file.DisposeAsync(); + } + + public override string ToString() + { + return this.objectUrlDomString; + } + } +#endif +} diff --git a/src/Demo/Blazor.FileReader.Wasm.Demo/Blazor.FileReader.Wasm.Demo.csproj b/src/Demo/Blazor.FileReader.Wasm.Demo/Blazor.FileReader.Wasm.Demo.csproj index e9ce535..c9de9b5 100644 --- a/src/Demo/Blazor.FileReader.Wasm.Demo/Blazor.FileReader.Wasm.Demo.csproj +++ b/src/Demo/Blazor.FileReader.Wasm.Demo/Blazor.FileReader.Wasm.Demo.csproj @@ -24,5 +24,11 @@ + + + + ObjectReferenceCommon.razor.cs + + diff --git a/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectReferenceCommon.razor b/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectReferenceCommon.razor index ce749f6..7af25cc 100644 --- a/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectReferenceCommon.razor +++ b/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectReferenceCommon.razor @@ -5,11 +5,12 @@
This demo reads a file into a js object reference - and reads some properties from it in a custom js function. This method is only suppoerted for .NET5 and higher. + and reads some properties from it in a custom js function. This method is only supported for .NET5 and higher.

+
\ No newline at end of file diff --git a/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectUrl.razor b/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectUrl.razor new file mode 100644 index 0000000..4852ee4 --- /dev/null +++ b/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectUrl.razor @@ -0,0 +1,18 @@ +@page "/ObjectUrl" +@inherits ObjectUrlBase + +

Hello, object url!

+ +
+This demo returns an Object url + and reads some properties from it in a custom js function. This method is only supported for .NET5 and higher. +
+Don't forget to dispose the url if no longer used, as not doing so will create a memoryleak. Disposing calls revokeObjectURL. + +
+ + + +
+
+ \ No newline at end of file diff --git a/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectUrl.razor.cs b/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectUrl.razor.cs new file mode 100644 index 0000000..229b9de --- /dev/null +++ b/src/Demo/Blazor.FileReader.Wasm.Demo/Pages/ObjectUrl.razor.cs @@ -0,0 +1,47 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using System; +using System.Linq; +using System.Threading.Tasks; +using Tewr.Blazor.FileReader; + +namespace Blazor.FileReader.Demo.Common +{ + public partial class ObjectUrlBase : ComponentBase + { + [Inject] + IFileReaderService FileReaderService { get; set; } + + public ElementReference inputElement; + public string Output { get; set; } + + public async Task ReadFile() + { + Output = string.Empty; + this.StateHasChanged(); + var files = await FileReaderService.CreateReference(inputElement).EnumerateFilesAsync(); + + if (!files.Any()) + { + await WriteLine("No file selected"); + } + + foreach (var file in files) + { + var objectUrl = await file.GetObjectUrlAsync(); + await using (objectUrl) + { + // Print the object url + await WriteLine($"Object url: {objectUrl}"); + } + + } + } + + public async Task WriteLine(string log) + { + Output += $"{log}{Environment.NewLine}"; + await InvokeAsync(StateHasChanged); + } + } +} diff --git a/src/Demo/Blazor.FileReader.Wasm.Demo/Shared/NavMenu.razor b/src/Demo/Blazor.FileReader.Wasm.Demo/Shared/NavMenu.razor index 6eddd25..05d2658 100644 --- a/src/Demo/Blazor.FileReader.Wasm.Demo/Shared/NavMenu.razor +++ b/src/Demo/Blazor.FileReader.Wasm.Demo/Shared/NavMenu.razor @@ -42,6 +42,11 @@ JSObjectReference +