Blazor的InputFile组件是官方推荐的文件上传方式,封装HTML input type="file"并提供C# API读取文件流,但不自动发送HTTP请求,需手动实现上传逻辑。
Blazor 的 InputFile 组件是 WebAssembly 和 Server 两种托管模
型下上传文件的官方推荐方式,它封装了原生 HTML ,并提供便捷的 C# API 来读取文件内容。关键点在于:它不直接发送 HTTP 请求,而是让你自行处理文件流(如读取、校验、分块或调用后端 API),所以“上传”动作需要你额外实现。
最简单的场景是用户选中一个文件后,立即读取其全部内容到内存:
@code 块中定义 OnFileSelected 方法,接收 InputFileChangeEventArgs
file.Data.ReadBytesAsync(file.Size) 获取 byte[](注意:仅适用于小文件,如头像、配置文件)示例片段:
WebAssembly 模型支持通过 InputFile 一次性选择多个文件(设置 multiple 属性),但 Server 模型受限于 SignalR 传输机制,不建议直接传大文件。若需进度反馈:
Stream + StreamReader 分块读取(避免内存爆炸)Progress 报告已读字节数,再换算成百分比multipart/form-data 提交InputFile 本身不发请求,你需要手动构造 MultipartFormDataContent 并用 HttpClient 发送:
var content = new MultipartFormDataContent()
content.Add(new StreamContent(file.Data.OpenReadStream()), "file", file.Name) 添加文件流content.Add(new StringContent("doc", Encoding.UTF8), "category")
http.PostAsync("/api/upload", content),服务端用 IFormFile 接收⚠️ 注意:Server 模式下 file.Data.OpenReadStream() 返回的是客户端上传的临时流,必须在当前请求生命周期内完成读取;WebAssembly 则完全在浏览器内存中操作。
e.GetMultipleFiles().FirstOrDefault() 却没判空;或未等待异步读取完成就访问结果ReadBytesAsync,改用 OpenReadStream() + 流式上传或分片上传Startup.cs 或 Program.cs 中设置了足够大的 MaxRequestBodySize(如 options.Limits.MaxRequestBodySize = 100_000_000;)file.FileName(非 ContentDisposition 解析),前端无需特殊编码
基本上就这些。掌握 InputFile 的核心是理解它只负责“读”,不负责“传”——剩下的交给你的逻辑和网络层。