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

100GB文件上传Azure Blob无报错但文件不存在,求解决方案

问题排查结论

  • Azure Blob存储完全支持100GB大小的文件上传,块Blob单文件最大支持4.75TB,无需切换到AWS。
  • 你遇到的问题完全是代码逻辑错误导致的,和Azure服务本身无关。

核心问题原因

  1. 分块数量超过Azure限制:你设置的单块大小是1MB,100GB的文件需要拆分出102400个块,而Azure块Blob最多仅支持50000个块,超过限制后提交块列表会直接失败,你没有捕获这个异常所以感知不到报错。
  2. 异步操作未等待完成、无异常捕获:你调用PutBlockListAsync提交块列表后没有等待操作完成,也没有对异步任务的异常做处理,就算提交失败你也收不到任何报错提示,自然看不到文件上传结果。
  3. 小文件可以上传成功是因为小文件走了单块直接上传的逻辑,没有触发分块数量限制和异步提交的问题。

修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:54:04