100GB文件上传Azure Blob无报错但文件不存在,求解决方案
问题排查结论
- Azure Blob存储完全支持100GB大小的文件上传,块Blob单文件最大支持4.75TB,无需切换到AWS。
- 你遇到的问题完全是代码逻辑错误导致的,和Azure服务本身无关。
核心问题原因
- 分块数量超过Azure限制:你设置的单块大小是1MB,100GB的文件需要拆分出102400个块,而Azure块Blob最多仅支持50000个块,超过限制后提交块列表会直接失败,你没有捕获这个异常所以感知不到报错。
- 异步操作未等待完成、无异常捕获:你调用
PutBlockListAsync提交块列表后没有等待操作完成,也没有对异步任务的异常做处理,就算提交失败你也收不到任何报错提示,自然看不到文件上传结果。 - 小文件可以上传成功是因为小文件走了单块直接上传的逻辑,没有触发分块数量限制和异步提交的问题。
修复方案
1. 调整分块大小
把单块大小调整到4MB及以上,100GB文件用4MB块拆分仅需要25600个块,远低于50000的上限,同时可以减少请求次数,提升上传效率。
2. 简化上传逻辑,不用手写分块
Azure Blob存储的.NET SDK已经内置了成熟的大文件分块上传、断点续传、异常重试逻辑,直接调用UploadFromFileAsync即可,不需要自己手写分块逻辑,避免出错。
3. 正确处理异步操作和异常
使用async/await代替ContinueWith+ManualResetEvent的复杂写法,更易读也更容易捕获异常。
修正后的代码示例
// 方法改为异步 public async Task UploadFileAsync(string filePath) { try { var fileInfo = new FileInfo(filePath); CloudBlockBlob myBlob = _container.GetBlockBlobReference(fileInfo.Name); // 设置单块大小为4MB,可根据实际网络情况调整到8MB/16MB,最大支持4000MB myBlob.StreamWriteSizeInBytes = 4 * 1024 * 1024; // 直接调用SDK内置的上传方法,内部自动处理分块、重试、提交块列表 await myBlob.UploadFromFileAsync(filePath); Console.WriteLine("文件上传成功"); } catch (Exception ex) { // 捕获异常方便排查问题 Console.WriteLine($"上传失败,错误信息:{ex.Message}"); Console.WriteLine($"堆栈信息:{ex.StackTrace}"); throw; } }
内容的提问来源于stack exchange,提问作者skeferstat
相关产品推荐
相关产品推荐

