Blazor WASM上传文件至ASP.NET Core Web API的最优方案咨询
Blazor WASM 文件流式上传(不加载文件到内存)
客户端(Blazor WASM)实现
直接利用InputFile获取文件流,通过MultipartFormDataContent构建表单数据流式传输,无需将文件内容读入内存:
private async Task HandleFileUpload(InputFileChangeEventArgs e) { const long maxFileSize = 1024 * 1024; // 最大1MB var file = e.File; // 验证文件类型(可选,确保是XML) if (!file.ContentType.Equals("text/xml", StringComparison.OrdinalIgnoreCase) && !file.Name.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) { // 提示用户上传XML文件 return; } using var httpClient = new HttpClient(); using var content = new MultipartFormDataContent(); // 添加其他业务数据(对应原UploadModel里的SomeObject) var dataJson = JsonSerializer.Serialize(yourSomeObjectInstance); content.Add(new StringContent(dataJson, Encoding.UTF8, "application/json"), "Data"); // 添加文件流,直接从InputFile获取,不加载到内存 using var fileStream = await file.OpenReadStream(maxFileSize); content.Add(new StreamContent(fileStream), "File", file.Name); // 发送POST请求到服务器端点 var response = await httpClient.PostAsync("/api/Upload/ProcessXml", content); response.EnsureSuccessStatusCode(); }
服务器端(ASP.NET Core)实现
通过IFormFile接收文件流,直接读取并处理XML内容,无需保存文件到磁盘:
1. 定义API控制器
[ApiController] [Route("api/[controller]")] public class UploadController : ControllerBase { private readonly YourDbContext _dbContext; public UploadController(YourDbContext dbContext) { _dbContext = dbContext; } [HttpPost("ProcessXml")] public async Task<IActionResult> ProcessXml([FromForm] UploadRequest request) { // 解析业务数据 var someObject = JsonSerializer.Deserialize<SomeObject>(request.Data); // 直接读取文件流处理XML using var xmlReader = XmlReader.Create(request.File.OpenReadStream()); var xmlDoc = XDocument.Load(xmlReader); // 从XML中提取信息,存入数据库 var extractedData = new YourEntity { // 从xmlDoc和someObject中赋值属性 }; _dbContext.YourEntities.Add(extractedData); await _dbContext.SaveChangesAsync(); return Ok("处理完成"); } } // 接收请求的模型 public class UploadRequest { public string Data { get; set; } // 序列化后的SomeObject public IFormFile File { get; set; } // 上传的XML文件流 }
2. 配置请求大小限制(可选)
若需调整最大上传文件大小,在Program.cs中配置:
builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options => { options.MultipartBodyLengthLimit = 1024 * 1024; // 1MB,与客户端保持一致 });
核心优势
- 客户端无需将整个文件加载到内存,直接流式传输,降低内存占用
- 服务器端通过
IFormFile读取流,直接处理XML内容,无需落地到磁盘,符合文档推荐的高效传输方式 - 完全适配1MB以内的XML文件上传场景
内容的提问来源于stack exchange,提问作者Goran
相关产品推荐
相关产品推荐

