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

Asp.net Core服务器上传200MB文件至Azure Blob存储失败求助

解决ASP.NET Core上传大文件到Azure Blob的请求体过大问题

针对你遇到的200MB以上文件上传报错的问题,咱们从ASP.NET Core请求限制和Azure Blob上传配置两个核心环节来解决:

一、调整ASP.NET Core的请求大小限制

默认情况下,ASP.NET Core对multipart/form-data类型的请求有大小限制(默认128MB),同时Kestrel服务器也有默认的请求体大小限制(默认30MB),这两个限制都会导致200MB文件上传时报错。你需要在配置中修改这两个参数:

1. 配置FormOptions(针对multipart请求)

如果是.NET Core 2.x-3.x,在Startup.cs的ConfigureServices方法中添加:

services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 2147483648; // 设置为2GB,可根据你的需求调整
    options.ValueLengthLimit = int.MaxValue; // 确保单个表单值的长度限制足够
});

如果是.NET 5+,在Program.cs中添加:

builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 2147483648;
    options.ValueLengthLimit = int.MaxValue;
});

2. 配置Kestrel服务器的请求大小限制

同样在Program.cs中(.NET 5+)或者Startup.cs的ConfigureWebHostDefaults中(.NET Core 2.x-3.x)添加Kestrel的限制配置:

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 2147483648; // 2GB,和上面的限制保持一致或更大
});

二、调整Azure Blob上传的分块配置

你提到的UploadFromStreamAsync默认4MB块上传,虽然这不是直接导致请求体过大的原因,但调整分块大小可以优化大文件上传的效率和稳定性,同时避免单块请求超出Azure的限制(旧版Blob存储单块最大100MB)。在WindowsAzure.Storage 9.1.1版本中,你可以通过BlobRequestOptions来配置:

var blobRequestOptions = new BlobRequestOptions
{
    // 设置单文件上传阈值,超过这个大小自动启用分块上传
    SingleBlobUploadThresholdInBytes = 104857600, // 100MB,不超过Blob单块最大限制
    ParallelOperationThreadCount = 4 // 并行上传的线程数,根据服务器性能调整
};

// 上传时传入配置
await cloudBlockBlob.UploadFromStreamAsync(stream, null, blobRequestOptions, new OperationContext());

三、额外注意:用流方式处理文件,避免内存溢出

确保在控制器中处理文件时,直接使用IFormFile的流,不要将整个文件加载到内存中,比如:

[HttpPost("upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("请选择要上传的文件");

    // 初始化Blob客户端(替换为你的存储连接字符串和容器名)
    var storageAccount = CloudStorageAccount.Parse("你的Azure存储连接字符串");
    var blobClient = storageAccount.CreateCloudBlobClient();
    var container = blobClient.GetContainerReference("你的容器名称");
    var blockBlob = container.GetBlockBlobReference(file.FileName);

    // 配置上传选项
    var requestOptions = new BlobRequestOptions
    {
        SingleBlobUploadThresholdInBytes = 104857600,
        ParallelOperationThreadCount = 4
    };

    // 直接使用文件流上传,避免内存占用过高
    using (var stream = file.OpenReadStream())
    {
        await blockBlob.UploadFromStreamAsync(stream, null, requestOptions, new OperationContext());
    }

    return Ok("文件上传成功");
}

按照以上步骤配置后,200MB及以上的大文件应该就能正常上传到Azure Blob存储了。

内容的提问来源于stack exchange,提问作者Artem Danchenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:49:38