使用 HTTP 协议上传文件的标准做法是:使用 multipart/form-data 。但有时为了实现简单且要上传的文件不会太大,仍然会采用 application/x-www-form-urlencoded 上传文件,这就需要在上传前对二进制文件进行编码,比如使用 Base64 。

public async Task<IActionResult> SubmitImage(int id, [FromForm(Name = "image")] string image)
    if (string.IsNullOrWhiteSpace(image)) throw new UserFriendlyException("图片不能为空");
    var data = Convert.FromBase64String(image);
    //TODO:处理图片
 

以上代码一直工作良好,很久以后接到客户反馈有几张图片一直上传失败,明明选择了图片却还是提示“图片不能为空”。这说明 image 参数没有被正确绑定上。图片的大小为 6MB 左右,这很显然没有突破 IIS 的限制(默认为 30MB),也没有突破 ASP.NET Ccor 对单个请求大小的限制(默认为 30MB)。我特意去查看了 Windows 日志,也没有看到报错信息。

模拟用户的请求,确实在 HTTP 抓包中看到了图片,但是调试器中 image 确实为空。几番搜索下来,我找到了一个名为 FormOptions 的配置类:

https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.features.formoptions?view=aspnetcore-6.0

其中的 ValueLengthLimit 属性有如下定义:

A limit on the length of individual form values. Forms containing values that exceed this limit will throw an InvalidDataException when parsed. Defaults to 4,194,304 bytes‬, which is approximately 4MB.

也就是说:默认情况下,ASP.NET Core 限制了每个 POST 数据值的长度为 4 MB 大小,超过就会抛出 InvalidDataException 异常。我很可能是遇到了这个限制,但因为并没有抛异常所以不太敢确定。

services.Configure<FormOptions>(options=>{
  options.ValueLengthLimit = 209715200;//200MB
 

以上代码将限制提升到了 200MB,经测试问题解决。

使用 Base64 将文件编码后虽然会简化,但同时会导致网络传输内容增大,或者遇到本文所示的异常(默认情况下,multipart/form-data 对单个上传项的限制是 128MB)。如果你使用的是 MVC,也可以直接使用 RequestFormLimitsAttribute 解决该问题:

https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.mvc.requestformlimitsattribute?view=aspnetcore-6.0

使用 HTTP 协议上传文件的标准做法是:使用multipart/form-data。但有时为了实现简单且要上传的文件不会太大,仍然会采用application/x-www-form-urlencoded上传文件,这就需要在上传前对二进制文件进行编码,比如使用 Base64 。public async Task&lt;IActionResult&gt; Submi...
1.Get请求携带数据量的各种限制及解决办法 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。 到新公司处理的第一个线上问题是某个商品页,在某个人机器上访问失败,nginx返回400错误,但其它人机器上没有问题,即使用虚拟机重建了出问题机器的软硬件环境也不会出问题。 经过对出问题机器的http请求进...
前日,看到这个问题了。 没有深入了解。我的常识里面get最大传递的值为256b,post 是2M。这是很久以前不知在哪看到的。于是又百度一下。看到两篇文章装过来看看: 浅谈 HTTP中Get与Post的区别GET方式传值的最大长度都有些道理。引用其中一些观点: get 首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度...
1、PadLeft和PadRight使用说明 两个方法都是对字符串格式化进行补齐填充,PadLeft是左边,而PadRight是右边 '1010'.PadLeft(10,'0') // 结果:0000001010 '1010'.PadRight(10,'0') // 结果:1010000000 2、padStart和padEnd使用说明 '1010'.padSt...
GET请求长度限制 理论上GET请求数据长度没有限制的,真正起到限制的是浏览器对其长度进行了限制。 为兼容各个浏览器的请求长度,可以总结为:URL长度限制为2083个字符。 下面是各个浏览器对字符长度的具体限制: Microsoft Internet Explorer (Browser) IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。 Firefox (Browser) 对于Firefox浏览器URL的长度限制为65,536个字符。 Safari (Browser)
1、IIS下取消POST大小的限制限制默认POST长度是4096 Byte)      在web.config文件中的system.web配置节增加下面语句。(IIS默认长度为30兆,web.config中maxRequestLength设置超过30兆同样上传不成功)  &lt;httpRuntime targetFramework="4.5.1" requestValidationMod...
action的参数列表中有[fromform]并且是list进行接收数据的,在list的条数超出一定的数量,ui端调用接口的候可能会抛出500错误,查看console的消息却显示是跨域,但经过分析后很明显不是跨域问题。几番思量,仍认为是数据超长的问题。 我选择的解决方案是在startup.cs内的ConfigureServices方法内添加一段对接收数据的最大容量限制, services.Configure<FormOptions>(options =>
ASP.NET Core中如何更改文件上传大小限制maxAllowedContentLength属性值 Web.config中的maxAllowedContentLength这个属性可以用来设置Http的Post类型请求可以提交的最大数据量,超过这个数据量的Http请求ASP.NET Core会拒绝并报错,由于ASP.NET Core的项目文件中取消了Web.config文件,所以我们无法直接在visual studio的解决方案目录中再来设置maxAllowedContentLength的属性值。 首先说下 C#语言实现http post协议传参 调用其他接口失败 在网上查找好多资料 解决办法有: 1.wbe.config 设置httpruntime中Requestlegth最大 2.IIS设置 3.改变ContentType类型 尝试后 还是失败 最终自己写了个接口 传相同的参数 调试发现json传过来的参数 是urlencode的 页面中req...
是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度限制 是2083字节(2K+35字节)。对于其他浏览器,如FireFox,Netscape等,则没有长度限制,这个候其限制取决于服务器的操作系统。即 如果url太长,服务
使用axios的data后台: [HttpPost] public string Login([FromBody] dynamic data)//(string username,string password) var aa= Request.ContentLength; ;