You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:13:09