表单键或值的长度限制超过2048 [英] Form key or value length limit 2048 exceeded
问题描述
我正在使用asp.net内核来构建API.我有一个允许用户使用此代码上传个人资料图片的请求
I am using asp.net core to build API. I have a request that allow user to upload profile image using this code
[HttpPost("{company_id}/updateLogo")]
public async Task<IActionResult> updateCompanyLogo(IFormFile imgfile,int company_id)
{
string imageName;
// upload file
if (imgfile == null || imgfile.Length == 0)
imageName = "default-logo.jpg";
else
{
imageName = Guid.NewGuid() + imgfile.FileName;
var path = _hostingEnvironment.WebRootPath + $@"\Imgs\{imageName}";
if (imgfile.ContentType.ToLower().Contains("image"))
{
using (var fileStream = new FileStream(path, FileMode.Create))
{
await imgfile.CopyToAsync(fileStream);
}
}
}
.
.
,但始终返回此异常:Form key or value length limit 2048 exceeded
请求
http://i.imgur.com/25B0qkD.png
but it keeps returning this exception: Form key or value length limit 2048 exceeded
The Request
http://i.imgur.com/25B0qkD.png
更新:
我已经试过了这段代码,但是没用
Update:
I have tried this code but it doesn't work
services.Configure<FormOptions>(options =>
{
options.ValueLengthLimit = int.MaxValue; //not recommended value
options.MultipartBodyLengthLimit = long.MaxValue; //not recommended value
});
推荐答案
默认情况下,ASP.NET Core在 FormOptions
如下所示:
By default, ASP.NET Core enforces key/value length limit of 2048 inside FormReader
as constant and applied in FormOptions
as shown below:
public class FormReader : IDisposable
{
public const int DefaultValueCountLimit = 1024;
public const int DefaultKeyLengthLimit = 1024 * 2; // 2048
public const int DefaultValueLengthLimit = 1024 * 1024 * 4; // 4194304
// other stuff
}
public class FormOptions
{
// other stuff
public int ValueCountLimit { get; set; } = DefaultValueCountLimit;
public int KeyLengthLimit { get; set; } = FormReader.DefaultKeyLengthLimit;
public int ValueLengthLimit { get; set; } = DefaultValueLengthLimit;
// other stuff
}
因此,您可以使用KeyValueLimit
和ValueCountLimit
属性(也包括ValueLengthLimit
等)来创建自定义属性,以明确地自行设置键/值长度限制:
Hence, you may create a custom attribute to explicitly set key/value length limit on your own by using KeyValueLimit
and ValueCountLimit
property (also ValueLengthLimit
etc.):
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class RequestSizeLimitAttribute : Attribute, IAuthorizationFilter, IOrderedFilter
{
private readonly FormOptions _formOptions;
public RequestSizeLimitAttribute(int valueCountLimit)
{
_formOptions = new FormOptions()
{
// tip: you can use different arguments to set each properties instead of single argument
KeyLengthLimit = valueCountLimit,
ValueCountLimit = valueCountLimit,
ValueLengthLimit = valueCountLimit
// uncomment this line below if you want to set multipart body limit too
// MultipartBodyLengthLimit = valueCountLimit
};
}
public int Order { get; set; }
// taken from /a/38396065
public void OnAuthorization(AuthorizationFilterContext context)
{
var contextFeatures = context.HttpContext.Features;
var formFeature = contextFeatures.Get<IFormFeature>();
if (formFeature == null || formFeature.Form == null)
{
// Setting length limit when the form request is not yet being read
contextFeatures.Set<IFormFeature>(new FormFeature(context.HttpContext.Request, _formOptions));
}
}
}
操作方法中的用法示例:
Usage example in action method:
[HttpPost("{company_id}/updateLogo")]
[RequestSizeLimit(valueCountLimit: 2147483648)] // e.g. 2 GB request limit
public async Task<IActionResult> updateCompanyLogo(IFormFile imgfile, int company_id)
{
// contents removed for brevity
}
注意::如果正在使用最新版本的ASP.NET Core,请将名为ValueCountLimit
的属性更改为KeyCountLimit
.
NB: If latest version of ASP.NET Core is being used, change property named ValueCountLimit
to KeyCountLimit
.
更新:Order
属性必须包含在属性类中,因为它是已实现的接口IOrderedFilter
的成员.
Update: The Order
property must be included on attribute class because it is a member of implemented interface IOrderedFilter
.
类似的问题:
表单提交导致"InvalidDataException" :超出了表单值计数限制1024."
这篇关于表单键或值的长度限制超过2048的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!