UWP中使用Flurl.Http上传视频遇413(Request Entity Too Large)错误
解决UWP中Flurl.Http上传视频报413(Request Entity Too Large)的问题
嘿,这个413错误我太熟了!本质就是你的视频文件大小超过了服务器允许的最大请求体尺寸,所以被拒绝了。下面给你几个靠谱的解决思路:
1. 调整服务器端的上传大小限制
这是最直接的解决方案,毕竟413的根源在服务器配置。不同服务器的调整方式不一样,给你几个常见场景的配置示例:
ASP.NET Core:在
Program.cs里设置请求大小限制var builder = WebApplication.CreateBuilder(args); // 添加控制器服务 builder.Services.AddControllers(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); // 设置最大请求体大小为100MB(根据你的视频大小调整) app.Use(async (context, next) => { var feature = context.Features.Get<IHttpMaxRequestBodySizeFeature>(); if (feature != null) { feature.MaxRequestBodySize = 100 * 1024 * 1024; // 100MB } await next.Invoke(); }); app.MapControllers(); app.Run();IIS:修改
web.config中的requestLimits<system.webServer> <security> <requestFiltering> <!-- 设置最大允许的请求大小为100MB --> <requestLimits maxAllowedContentLength="104857600" /> </requestFiltering> </security> </system.webServer>Nginx:在配置文件中添加
client_max_body_sizeserver { # 允许最大上传100MB的文件 client_max_body_size 100M; # 其他配置... }
2. 实现分片上传(适合大文件或无法修改服务器的场景)
如果服务器没法调整大小限制,或者你的视频特别大,分片上传是更稳妥的方案——把视频拆成小块逐个上传,最后让服务器合并。Flurl本身没有内置分片API,但可以自己实现:
// 先获取视频文件的总大小,计算分片数 var fileSize = (await file.GetBasicPropertiesAsync()).Size; int chunkSize = 10 * 1024 * 1024; // 每个分片10MB int totalParts = (int)Math.Ceiling((double)fileSize / chunkSize); using (var stream = await file.OpenStreamForReadAsync()) { byte[] buffer = new byte[chunkSize]; int bytesRead; int partIndex = 0; while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0) { // 创建当前分片的流 var chunkStream = new MemoryStream(buffer, 0, bytesRead); // 用Flurl上传当前分片,附带分片索引和总分片数 await upload_url.PostMultipartAsync(mp => mp .AddFile("file", chunkStream, $"video_part_{partIndex}.mp4", null, bytesRead) .AddString("partIndex", partIndex.ToString()) .AddString("totalParts", totalParts.ToString()) .AddString("fileName", file.Name) ).ReceiveString(); partIndex++; } // 所有分片上传完成后,发送合并请求给服务器 await upload_url.PostAsync(new { action = "merge", fileName = file.Name }); }
注意:服务器端需要对应实现接收分片、存储分片,以及合并分片的逻辑。
3. 检查Flurl.Http客户端的缓冲区限制
虽然Flurl默认没有请求大小限制,但如果你自定义了HttpClientHandler,可能设置了MaxRequestContentBufferSize,需要确保这个值足够大:
// 创建自定义HttpClientHandler,调整缓冲区大小 var handler = new HttpClientHandler { MaxRequestContentBufferSize = 100 * 1024 * 1024 // 100MB }; // 使用这个handler创建FlurlClient var flurlClient = new FlurlClient(new HttpClient(handler)); // 用这个client发起上传请求 await flurlClient.Request(upload_url) .PostMultipartAsync(mp => mp .AddFile("file", buffer.AsStream(), "story.mp4", null, (int)buffer.Length) ).ReceiveString();
内容的提问来源于stack exchange,提问作者Ivan Reshetov
相关产品推荐
相关产品推荐

