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

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_size

    server {
      # 允许最大上传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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:00