Skip to content

Commit dd35720

Browse files
1.4.0
1 parent 2ba140e commit dd35720

5 files changed

Lines changed: 46 additions & 26 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [1.4.0] - 2026-08-01
8+
- Drag-and-drop now streams files from JS to .NET via JS interop streaming (`IJSStreamReference` + `OpenReadStreamAsync`) instead of sending the whole file in a single SignalR interop message
9+
- Fixes the 32 KB `MaximumReceiveMessageSize` failure on Blazor Server when dropping files
10+
- `MaxFileSize` is now also enforced server-side on the drop path (not only client-side)
11+
- Drop path now raises one `OnBase64FilesReceived`/`OnBinaryFilesReceived` event per file (previously one event per drop batch)
12+
713
## [1.3.0] - 2026-05-25
814
- Added `OnProcessingChanged` (`EventCallback<bool>`) — signals file processing start/end for spinner integration
915
- Fixed JS `removeEventListener` not matching (listener leak) — `_dropListeners` Map stores stable refs

SuperSimpleBlazorDropzone.Sample/SuperSimpleBlazorDropzone.Sample.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.8" />
11-
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.8" PrivateAssets="all" />
10+
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.10" />
11+
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.10" PrivateAssets="all" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

src/SuperSimpleBlazorDropzone/SimpleDropzone.razor

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,28 +101,51 @@
101101
}
102102

103103
[JSInvokable]
104-
public async Task ReceiveBinaryData(BinaryFileTransfer[] files)
104+
public async Task ReceiveData(IJSStreamReference streamReference, string name, string type, long size)
105105
{
106+
if (MaxFileSize.HasValue && size > MaxFileSize.Value)
107+
{
108+
return;
109+
}
106110
if (OnProcessingChanged.HasDelegate)
111+
{
107112
await OnProcessingChanged.InvokeAsync(true);
108-
113+
}
109114
try
110115
{
116+
var maxAllowedSize = MaxFileSize ?? long.MaxValue;
117+
await using var stream = await streamReference.OpenReadStreamAsync(maxAllowedSize: maxAllowedSize);
118+
await using var memoryStream = new MemoryStream();
119+
await stream.CopyToAsync(memoryStream);
120+
var buffer = memoryStream.ToArray();
121+
var extension = name.Contains('.') ? name.Split('.').Last() : "";
111122
switch (ContentOutputType)
112123
{
113124
case FileContentOutput.Base64:
114-
var convertedFiles = files.Select(f => new Base64FileTransfer
125+
await OnBase64FilesReceived.InvokeAsync(new[]
115126
{
116-
Name = f.Name,
117-
Extension = f.Extension,
118-
Type = f.Type,
119-
Size = f.Size,
120-
Content = Convert.ToBase64String(f.Content)
121-
}).ToArray();
122-
await OnBase64FilesReceived.InvokeAsync(convertedFiles);
127+
new Base64FileTransfer
128+
{
129+
Name = name,
130+
Extension = extension,
131+
Type = type,
132+
Size = size,
133+
Content = Convert.ToBase64String(buffer)
134+
}
135+
});
123136
break;
124137
case FileContentOutput.Binary:
125-
await OnBinaryFilesReceived.InvokeAsync(files);
138+
await OnBinaryFilesReceived.InvokeAsync(new[]
139+
{
140+
new BinaryFileTransfer
141+
{
142+
Name = name,
143+
Extension = extension,
144+
Type = type,
145+
Size = size,
146+
Content = buffer
147+
}
148+
});
126149
break;
127150
default:
128151
throw new ArgumentOutOfRangeException();
@@ -131,7 +154,9 @@
131154
finally
132155
{
133156
if (OnProcessingChanged.HasDelegate)
157+
{
134158
await OnProcessingChanged.InvokeAsync(false);
159+
}
135160
}
136161
await _module!.InvokeVoidAsync("setDragActive", DropperId, false, DragActiveCssClass);
137162
}

src/SuperSimpleBlazorDropzone/SimpleDropzone.razor.js

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,11 @@ export const handleDrop = async (dotNetRef, event, allowMultiple, maxFileSize, d
1616
if (files.length < 1) return;
1717

1818
const actualFiles = allowMultiple ? files : [files[0]];
19-
const result = [];
2019

2120
for (const file of actualFiles) {
2221
if (maxFileSize && file.size > maxFileSize) continue;
23-
const buffer = new Uint8Array(await file.arrayBuffer());
24-
result.push({
25-
name: file.name,
26-
extension: file.name.includes('.') ? file.name.split('.').pop() : '',
27-
type: file.type,
28-
size: file.size,
29-
content: buffer
30-
});
22+
await dotNetRef.invokeMethodAsync('ReceiveData', DotNet.createJSStreamReference(file), file.name, file.type, file.size);
3123
}
32-
33-
if (result.length === 0) return;
34-
dotNetRef.invokeMethodAsync('ReceiveBinaryData', result);
3524
}
3625

3726
export const registerDropHandler = (dotNetRef, elementId, allowMultiple, maxFileSize, dragActiveCssClass) => {

src/SuperSimpleBlazorDropzone/SuperSimpleBlazorDropzone.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<Title>Super Simple Blazor Dropzone</Title>
55
<PackageId>SuperSimpleBlazorDropzone</PackageId>
6-
<PackageVersion>1.3.0</PackageVersion>
6+
<PackageVersion>1.4.0</PackageVersion>
77
<Authors>Nicola Piermattei</Authors>
88
<PackageTags>blazor;dropzone;simple;file;upload</PackageTags>
99
<PackageProjectUrl>https://github.com/NikPiermafrost/SuperSimpleBlazorDropzone</PackageProjectUrl>

0 commit comments

Comments
 (0)