ASP.NET Core 5 WebAPI中MultiPartReaderStream流结束判定咨询
解决方案
方案1:直接通过Stream标准读取逻辑判断流结束(推荐)
所有继承自Stream的类都遵循统一的读取规范:调用ReadAsync/Read方法时,返回值为实际读取到的字节数,当返回值为0时,就代表流已经读取到末尾,不需要访问任何内部属性。
你拿到的section.Body已经是MultipartReader处理过的、仅对应当前文件的流,读取到返回0时就刚好读完整个文件内容,不会混入其他section或者boundary数据,完全满足你的上传需求。
示例代码如下,你可以直接替换你注释位置的逻辑:
// SharePoint推荐的分片大小,可根据实际网络调整,范围建议4MB~20MB const int ChunkSize = 10 * 1024 * 1024; var buffer = new byte[ChunkSize]; int bytesRead; long totalUploaded = 0; // 初始化SharePoint分片上传会话,此处替换为你自己的SharePoint上传会话初始化逻辑 var uploadSession = await CreateSharePointUploadSessionAsync(contentDisposition.FileName.Value); while ((bytesRead = await section.Body.ReadAsync(buffer.AsMemory(0, ChunkSize))) > 0) { // 直接将读取到的分片字节上传到SharePoint,不需要落盘 await UploadChunkToSharePointAsync(uploadSession, buffer.AsMemory(0, bytesRead), totalUploaded); totalUploaded += bytesRead; } // 所有分片上传完成,提交SharePoint上传会话 await FinalizeSharePointUploadAsync(uploadSession); return Ok(new { FileSize = totalUploaded });
方案2:提前获取文件总长度
如果你的SharePoint分片上传逻辑需要提前知道文件总大小,有两种可行方式:
- 前端上传时在请求头中新增自定义字段(比如
X-File-Total-Size),直接携带文件的真实大小,后端通过HttpContext.Request.Headers["X-File-Total-Size"]读取即可,该方式最可靠,性能无损耗 - 若无法修改前端,可以先读取一遍
section.Body统计总长度,再重置流重新读取上传,但大文件场景下会额外消耗一倍IO,不推荐使用
内容的提问来源于stack exchange,提问作者JBL
相关产品推荐
相关产品推荐

