Default Button
Drag and Drop
<style> .mud-file-upload-dragarea { height: 150px; width: 100%; } </style> <MudCard Style="width: 25%;height: 300px;"> <MudCardHeader> <MudText Typo="Typo.h6">Default Button</MudText> </MudCardHeader> <MudCardContent> <MudFileUpload @bind-Files="_file" Disabled="_disabled" /> </MudCardContent> </MudCard> <MudCard Style="width: 65%;height:300px;"> <MudCardHeader> <MudText Typo="Typo.h6">Drag and Drop</MudText> </MudCardHeader> <MudCardContent> <MudFileUpload @bind-Files="_files" DragAndDrop="true" Disabled="_disabled" /> </MudCardContent> </MudCard> <MudItem md="12" Class="d-flex justify-center"> <MudSwitch T="bool" @bind-Value="_disabled" Label="Disabled" LabelPlacement="Placement.Right" /> </MudItem>
@code { private bool _disabled = false; private IBrowserFile _file = new DummyBrowserFile("test1.jpg", DateTimeOffset.Now, 0, "image/jpeg", []); private IReadOnlyList<IBrowserFile> _files = [ new DummyBrowserFile("test1.jpg", DateTimeOffset.Now, 0, "image/jpeg", []), new DummyBrowserFile("test2.jpg", DateTimeOffset.Now, 0, "image/jpeg", []), ]; public class DummyBrowserFile : IBrowserFile { public string Name { get; } public DateTimeOffset LastModified { get; } public long Size { get; } public string ContentType { get; } public byte[] Content { get; } public DummyBrowserFile(string name, DateTimeOffset lastModified, long size, string contentType, byte[] content) { Name = name; LastModified = lastModified; Size = size; ContentType = contentType; Content = content; } public Stream OpenReadStream(long maxAllowedSize = 512000, CancellationToken cancellationToken = default) => new MemoryStream(Content); } }
Custom Content
Use a MudButton, MudIconButton, MudFab, or any custom markup with the
CustomContent render fragment. The fragment receives the MudFileUpload context so you can call its API.
When Disabled is true, the component disables its child controls automatically.
0 Files:
<MudStack Row Justify="Justify.SpaceAround" AlignItems="AlignItems.Center" Class="mud-width-full"> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <CustomContent> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@context.OpenFilePickerAsync" StartIcon="@Icons.Material.Filled.CloudUpload"> Choose file </MudButton> </CustomContent> <SelectedTemplate /> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <CustomContent> <MudFab Color="Color.Secondary" StartIcon="@Icons.Material.Filled.Image" OnClick="@context.OpenFilePickerAsync" Label="Choose photo" /> </CustomContent> <SelectedTemplate /> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <CustomContent> <MudFab Color="Color.Success" OnClick="@context.OpenFilePickerAsync" StartIcon="@Icons.Material.Filled.AttachFile" /> </CustomContent> <SelectedTemplate /> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <CustomContent> <MudIconButton Color="Color.Info" OnClick="@context.OpenFilePickerAsync" Icon="@Icons.Material.Filled.PhotoCamera"> </MudIconButton> </CustomContent> <SelectedTemplate /> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles" Disabled> <CustomContent> <MudButton Variant="Variant.Filled" OnClick="@context.OpenFilePickerAsync" Color="Color.Primary"> Disabled button </MudButton> </CustomContent> <SelectedTemplate /> </MudFileUpload> </MudStack> <MudFlexBreak /> @if (_files != null) { <MudText Typo="@Typo.h6">@_files.Count() File@(_files.Count() == 1 ? "" : "s"):</MudText> @if (_files.Count > 0) { <MudFlexBreak /> <MudList T="string"> @foreach (var file in _files) { <MudListItem Icon="@Icons.Material.Filled.AttachFile" @key=""> @file.Name <code>@file.Size bytes</code> </MudListItem> } </MudList> } }
@code { private readonly IList<IBrowserFile> _files = new List<IBrowserFile>(); private void UploadFiles(IBrowserFile file) { _files.Add(file); //TODO upload the files to the server } }
SelectedTemplate
Use SelectedTemplate to customize how selected files are rendered. If you want to suppress the default chip list,
provide an empty <SelectedTemplate /> or SelectedTemplate="@(files => builder => { })". The @context parameter matches T.
No file selected
test1.jpg
test2.jpg
<MudStack Row Justify="Justify.SpaceAround" AlignItems="AlignItems.Start" Class="mud-width-full"> <MudFileUpload @bind-Files=@_file> <CustomContent> <MudButton Variant="Variant.Filled" OnClick="@context.OpenFilePickerAsync" Color="Color.Primary"> Default template </MudButton> </CustomContent> </MudFileUpload> <MudFileUpload T="IBrowserFile"> <CustomContent> <MudButton Variant="Variant.Filled" OnClick="@context.OpenFilePickerAsync" Color="Color.Primary"> Single file </MudButton> </CustomContent> <SelectedTemplate> @if (context != null) { <MudText>@context.Name</MudText> } else { <MudText>No file selected</MudText> } </SelectedTemplate> </MudFileUpload> <MudFileUpload @bind-Files=@_files> <CustomContent> <MudButton Variant="Variant.Filled" OnClick="@context.OpenFilePickerAsync" Color="Color.Secondary"> Multiple files </MudButton> </CustomContent> <SelectedTemplate> @if (context != null) { @foreach (var file in context) { <MudText>@file.Name</MudText> } } else { <MudText>No files selected</MudText> } </SelectedTemplate> </MudFileUpload> <MudFileUpload @bind-Files=@_file> <CustomContent> <MudFab Color="Color.Warning" StartIcon="@Icons.Material.Filled.Image" OnClick="@context.OpenFilePickerAsync" Label="No template" /> </CustomContent> <SelectedTemplate /> </MudFileUpload> </MudStack>
@code { private IBrowserFile _file = new DummyBrowserFile("test.jpg", DateTimeOffset.Now, 1024, "image/jpeg", new byte[1024]); private IReadOnlyList<IBrowserFile> _files = [ new DummyBrowserFile("test1.jpg", DateTimeOffset.Now, 1024, "image/jpeg", []), new DummyBrowserFile("test2.jpg", DateTimeOffset.Now, 1024, "image/jpeg", []), ]; public class DummyBrowserFile : IBrowserFile { public string Name { get; } public DateTimeOffset LastModified { get; } public long Size { get; } public string ContentType { get; } public byte[] Content { get; } public DummyBrowserFile(string name, DateTimeOffset lastModified, long size, string contentType, byte[] content) { Name = name; LastModified = lastModified; Size = size; ContentType = contentType; Content = content; } public Stream OpenReadStream(long maxAllowedSize = 512000, CancellationToken cancellationToken = default) => new MemoryStream(Content); } }