Multipart body length limit exceeded exception

后端 未结 3 1058
余生分开走
余生分开走 2020-12-08 09:21

Although having set the MaxRequestLength and maxAllowedContentLength to the maximum possible values in the web.config section, ASP.Net

相关标签:
3条回答
  • 2020-12-08 10:17

    I found the solution for this problem after reading some posts in GitHub. Conclusion is that they have to be set in the Startup class. For example:

    public void ConfigureServices(IServiceCollection services)
    {
            services.AddMvc();
            services.Configure<FormOptions>(x => {
                x.ValueLengthLimit = int.MaxValue;
                x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart
            })
     }
    

    This will solve the problem. However they also indicated that there is a [RequestFormSizeLimit] attribute, but I have been unable to reference it yet.

    0 讨论(0)
  • 2020-12-08 10:23

    in case some one still face this problem i've created a middle-ware which intercept the request and create another body

        public class FileStreamUploadMiddleware
        {
            private readonly RequestDelegate _next;
    
            public FileStreamUploadMiddleware(RequestDelegate next)
            {
                _next = next;
            }
    
            public async Task Invoke(HttpContext context)
            {
                if (context.Request.ContentType != null)
                {
                    if (context.Request.Headers.Any(x => x.Key == "Content-Disposition"))
                    {
                        var v = ContentDispositionHeaderValue.Parse(
                            new StringSegment(context.Request.Headers.First(x => x.Key == "Content-Disposition").Value));
                        if (HasFileContentDisposition(v))
                        {
                            using (var memoryStream = new MemoryStream())
                            {
                                context.Request.Body.CopyTo(memoryStream);
                                var length = memoryStream.Length;
                                var formCollection = context.Request.Form =
                                    new FormCollection(new Dictionary<string, StringValues>(),
                                        new FormFileCollection()
                                            {new FormFile(memoryStream, 0, length, v.Name.Value, v.FileName.Value)});
                            }
                        }
                    }
                }
    
                await _next.Invoke(context);
            }
    
            private static bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition)
            {
                // this part of code from  https://github.com/aspnet/Mvc/issues/7019#issuecomment-341626892
                return contentDisposition != null
                       && contentDisposition.DispositionType.Equals("form-data")
                       && (!string.IsNullOrEmpty(contentDisposition.FileName.Value)
                           || !string.IsNullOrEmpty(contentDisposition.FileNameStar.Value));
            }
        }
    

    and in the controller we can fetch the files form the request

            [HttpPost("/api/file")]
            public IActionResult GetFile([FromServices] IHttpContextAccessor contextAccessor,
                [FromServices] IHostingEnvironment environment)
            {
                //save the file
                var files = Request.Form.Files;
                foreach (var file in files)
                {
                    var memoryStream = new MemoryStream();
                    file.CopyTo(memoryStream);
    
                    var fileStream = File.Create(
                        $"{environment.WebRootPath}/images/background/{file.FileName}", (int) file.Length,
                        FileOptions.None);
                    fileStream.Write(memoryStream.ToArray(), 0, (int) file.Length);
    
                    fileStream.Flush();
                    fileStream.Dispose();
    
                    memoryStream.Flush();
                    memoryStream.Dispose();
                }
    
                return Ok();
            }
    

    you can improve the code for your needs eg: add form parameters in the body of the request and deserialize it.

    its a workaround i guess but it gets the work done.

    0 讨论(0)
  • 2020-12-08 10:25

    Alternatively use the attribute, so the equivalent for an action as resolved by Transcendant would be:

    [RequestFormLimits(ValueLengthLimit = int.MaxValue, MultipartBodyLengthLimit = int.MaxValue)]
    
    0 讨论(0)
提交回复
热议问题