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
相关产品推荐
相关产品推荐

