A pesar de haber fijado los MaxRequestLength y maxAllowedContentLength a los valores máximos posibles en el web.config sección, ASP.Net Core no me permite subir archivos de más de 134,217,728 Bytes. El error exacto que viene desde el servidor web es:

Produjo una excepción no controlada durante el proceso de la solicitud.

InvalidDataException: Varias partes del cuerpo el límite de longitud de 134217728 superado.

¿Hay alguna forma de lograrlo? (ASP.Net Núcleo)

Puedes publicar el seguimiento de pila de excepción?
Ya he solucionado este problema, por favor revise mi propia respuesta.

OriginalEl autor Transcendent | 2016-11-01

2 Comentarios

  1. 68

    He encontrado la solución para este problema después de leer algunos posts en GitHub. La conclusión es que tienen que ser establecidos en el Startup clase. Por ejemplo:

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

    Que esto va a resolver el problema. Sin embargo, también se indicó que hay una [RequestFormSizeLimit] atributo, pero he sido incapaz de hacer referencia a ella todavía.

    Gracias a Dios yo te encontré yo estaba perdido sin ti
    Alguien más tiene problemas para conseguir que esto funcione en las versiones más recientes?
    Sí, yo soy. Parece que no funciona con la última versión.
    incorrecto, he tenido que cambiar la web.config en mi azure app así
    Me puse la segunda variable a el valor máximo de tiempo en su lugar. Mi acción de controlador tiene un límite de 10gb para la carga de los resultados de la cliente arrastrar y soltar múltiples archivos. [RequestSizeLimit(10_000_000_000)] //10gb en hoteles de conciertos

    OriginalEl autor Transcendent

  2. 0

    en el caso de que alguien todavía se enfrentan a este problema, he creado un middle-ware que interceptar la petición y crear otro cuerpo

        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));
    }
    }

    y en el controlador que puede recuperar los archivos de formulario de la solicitud

            [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();
    }

    puede mejorar el código para sus necesidades, por ejemplo: agregar parámetros de formulario en el cuerpo de la solicitud y deserializar.

    su solución supongo, pero consigue el trabajo hecho.

    OriginalEl autor M.Nour Berro

Dejar respuesta

Please enter your comment!
Please enter your name here