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

使用UploadBlobAsync上传Excel至Blob文件损坏问题排查

问题原因分析

核心问题是MemoryStream的当前读取位置(Position)未重置:

在调用ExcelReaderFactory.CreateOpenXmlReader(ms)解析Excel后,流的读取指针已经移动到了流的末尾。此时直接将这个流传给UploadBlobAsync,Azure Blob的UploadBlobAsync方法会从流的当前位置开始读取数据,也就是从末尾开始读取,实际写入Blob的内容不完整(甚至是空的),最终导致上传后的文件大小异常、无法正常打开。

修复方案

有两种可靠的修复方式:

方案1:重置流的读取位置到起始点

在调用上传方法前,手动将MemoryStream的Position设为0,让读取操作从头开始:

await file.CopyToAsync(ms);
var excelReader = ExcelReaderFactory.CreateOpenXmlReader(ms);
DataSet excelDataSet = excelReader.AsDataSet();

// 关键修复:重置流位置到起始处
ms.Position = 0;

await UploadExcelToBlobAsync(file.FileName, ms);

方案2:复制独立流用于上传

如果担心重置流位置会影响后续逻辑,可以在复制文件到流后,先复制一份独立的流专门用于上传,避免和Excel解析的流互相干扰:

await file.CopyToAsync(ms);
// 复制一份全新的流用于Blob上传
MemoryStream uploadStream = new MemoryStream(ms.ToArray());

var excelReader = ExcelReaderFactory.CreateOpenXmlReader(ms);
DataSet excelDataSet = excelReader.AsDataSet();

await UploadExcelToBlobAsync(file.FileName, uploadStream);
额外优化建议
  • 代码中文件扩展名写错了:.xslx应该修正为.xlsx,避免后续文件关联或识别错误。
  • 捕获异常时不要使用throw ex;,这会丢失原始调用栈信息,直接用throw;即可保留完整的异常追踪链。

内容的提问来源于stack exchange,提问作者The Inquisitive Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:10:28