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
+
+
+ Object Url
+
+
diff --git a/tests/BlazotFileReaderE2ETests/DragNDropTests.cs b/tests/BlazotFileReaderE2ETests/DragNDropTests.cs
index cfc2acd..8bc90ec 100644
--- a/tests/BlazotFileReaderE2ETests/DragNDropTests.cs
+++ b/tests/BlazotFileReaderE2ETests/DragNDropTests.cs
@@ -1,5 +1,6 @@
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
+using SeleniumExtras.WaitHelpers;
using System;
using System.IO;
using Tewr.Blazor.FileReader.E2ETests.Blazor3;
@@ -64,7 +65,8 @@ public void DragNDrop_ExtensionApi_IsExecuted()
// Then
var value = Browser.FindElement(By.Id("testDropEventsValues")).GetAttribute("value");
- Assert.Equal(@"\nOnDragOverMethod\nOnDragOverScriptn\nOnDropMethod\nOnDropScript", value);
+ var nl = Environment.NewLine;
+ Assert.Equal(@$"{nl}OnDragOverMethod{nl}OnDragOverScript{nl}OnDropMethod{nl}OnDropScript", value);
}
finally
{
diff --git a/tests/BlazotFileReaderE2ETests/Tewr.Blazor.FileReader.E2ETests.csproj b/tests/BlazotFileReaderE2ETests/Tewr.Blazor.FileReader.E2ETests.csproj
index 0dfc119..6050b39 100644
--- a/tests/BlazotFileReaderE2ETests/Tewr.Blazor.FileReader.E2ETests.csproj
+++ b/tests/BlazotFileReaderE2ETests/Tewr.Blazor.FileReader.E2ETests.csproj
@@ -7,10 +7,11 @@
-
-
-
-
+
+
+
+
+
runtime; build; native; contentfiles; analyzers; buildtransitive