ComponentsPickers and uploads
File upload
A file picker with any activator you like: a button, an icon or a drop zone. It hands you IBrowserFile objects; where the bytes go next is your decision, and in this gallery they never leave the app.
Button activators
CustomContent receives the upload component; call OpenFilePickerAsync from any button. An icon-only activator still needs an accessible name.
No file chosen. Files stay on this page; nothing is uploaded.
Drag-and-drop zone
DragAndDrop lets files be dropped on the content. Keep a visible Browse button too: dropping is impossible from a keyboard.
Drop specimen photos here
Multiple files with removal
Bind a read-only list of IBrowserFile for several files. AppendMultipleFiles adds to the selection instead of replacing it, and RemoveFileAsync drops one file.
No attachments yet. Each selection is added to the list.
Accepted types and a size bound
Accept only filters the browser's file dialog, so check the extension in code too. MaxFileSize removes oversized files and reports them itself.
CSV or TSV, up to 200 KB each. Larger files are dropped and named in the error above.
Processing a file without uploading it
Read the stream with a size limit and a cancellation token. Nothing is posted to any endpoint: in WebAssembly the bytes stay in the browser; on Blazor Server they travel only over this app's own circuit.
Choose a .txt, .csv or .md file up to 512 KB. It is read here and never posted anywhere.