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

发送Multipart Form文件时遇异常:流已被消耗无法重复读取

解决POST上传文件时"The stream was already consumed. It cannot be read again."异常

你的代码出现这个异常的核心原因是:IBrowserFile.OpenReadStream()返回的流属于不可重复读取的一次性流,而StreamContent在HttpClient.PostAsync发送请求时需要读取流内容,但原流的生命周期或特性导致请求发送时流已被耗尽。

修改方案

将IBrowserFile的流复制到MemoryStream中(MemoryStream支持重复读取,且可自主控制流位置),再用MemoryStream创建StreamContent:

public async Task<UploadResult> UploadProductImage(IBrowserFile file)
{
    if (file == null)
        return null;

    var content = new MultipartFormDataContent();

    // 复制原文件流到MemoryStream,避免原流被提前消耗
    using var memoryStream = new MemoryStream();
    await file.OpenReadStream().CopyToAsync(memoryStream);
    memoryStream.Position = 0; // 重置流指针到起始位置,确保能完整读取

    var streamContent = new StreamContent(memoryStream);
    streamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(file.ContentType);
    content.Add(streamContent, "file", file.Name);

    var response = await _httpClient.PostAsync("product-images", content);

    if (response.IsSuccessStatusCode)
    {
        // 替换为你的成功处理逻辑
        return null;
    }
    else
    {
        // 替换为你的错误处理逻辑
        return null;
    }
}

关键说明

  1. 移除了原代码中包裹file.OpenReadStream()的using块:原流的复制完成后,框架会自动管理其生命周期,无需手动释放
  2. memoryStream.Position = 0必须添加:流复制完成后指针停在末尾,重置到起始处才能让StreamContent读取全部文件内容

内容的提问来源于stack exchange,提问作者Adam Bazzal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:16:20