发送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; } }
关键说明
- 移除了原代码中包裹
file.OpenReadStream()的using块:原流的复制完成后,框架会自动管理其生命周期,无需手动释放 memoryStream.Position = 0必须添加:流复制完成后指针停在末尾,重置到起始处才能让StreamContent读取全部文件内容
内容的提问来源于stack exchange,提问作者Adam Bazzal
相关产品推荐
相关产品推荐

