超出多部分正文长度限制16384

14

我一直在尝试让这个工作起来,但是一直没有成功。

我的目标是使用JQuery AJAX上传一组FormData图像和附件。

我不断收到错误消息:“Multipart body length limit 16384 exceeded”

我在SO上找到了一个类似的问题: Multipart body length limit exceeded exception

如果有人能帮我或指点我方向,我将不胜感激。现在对我来说已经快到午夜了,我要放弃了 :(。

我正在使用ASP.NET Core 1.1。

以下是我的JavaScript代码:

let data = new FormData();
    data.enctype = "multipart/form-data";
    let file = $("#imgItem_image-upload-file")[0].files[0];

    data.append("image|" + file.name, file); //Works fine if alone.

    //Does not work, causes error on server side.
    for (var i = 0; i < objItem.Attachments[0].length; i++) {
        let attFile = objItem.Attachments[0][i].File;
        console.log(attFile);
        data.append("attachment|" + attFile.name, attFile);
    }

    data.append("Category", objItem.Category);
    data.append("NewCategory", objItem.NewCategory);
    data.append("Name", objItem.Name);
    data.append("IdentificationType", objItem.IdentificationType);
    data.append("SerialNumber", objItem.SerialNumber);
    data.append("IMEI", objItem.IMEI);
    data.append("EngineNumber", objItem.EngineNumber);
    data.append("MASNumber", objItem.MASNumber);
    data.append("NumberPlate", objItem.NumberPlate);
    data.append("VINNumber", objItem.VINNumber);
    data.append("Description", objItem.Description);
    $.ajax({
        url: "http://localhost:7001/api/AddPersonalItem",
        type: "POST",
        data: data,
        //dataType: "json",
        //headers: { 'Content-Type': false },
        //contentType: false,
        contentType: false, //'multipart/form-data'
        processData: false,
        // headers: { 
        //     'Accept': 'application/json',
        //     'Content-Type': 'application/json' 
        // },
        success: function (response) {

        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });

我也将这个内容添加到我的Startup.js文件中:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();

        //Multipart
        services.Configure<FormOptions>(x =>
        {
            x.MultipartBodyLengthLimit = 60000000;
        });
    }

这是我的API控制器代码:

        public ServiceCallResponse AddPersonalItem()
        {
            ItemObject io = new ItemObject();
            io.Attachments = new List<Attachment>();
            io.Image = new Image();

            //Get files.
            foreach (IFormFile file in Request.Form.Files)
            {
                //The file name also states what type of object this is.
                string type = file.Name.Split('|')[0];
                string name = file.Name.Split('|')[1];

                StreamReader reader = new StreamReader(file.OpenReadStream());
                byte[] bytes = Encoding.Unicode.GetBytes(reader.ReadToEnd());
                string base64 = Convert.ToBase64String(bytes);

                switch (type.ToLower().Trim())
                {
                    case "attachment":
                        Attachment a = new Attachment();
                        a.Name = name;
                        a.Base64 = base64;

                        io.Attachments.Add(a);
                        break;
                    case "image":
                        io.Image.Name = name;
                        io.Image.Base64 = base64;
                        break;
                }
            }
        }

尽管增加了多部分正文长度,我仍然遇到完全相同的错误。

错误发生在:

foreach (IFormFile file in Request.Form.Files)

如果我表述不够清楚,请告诉我,我会尝试详细解释!:)


1
我真的很想在这上面使用.NET Core,但我开始觉得我需要切换到WCF来提供我的服务...已经过去22天了,还在继续... - Fred
https://github.com/aspnet/Mvc/issues/5128 - Jason Rowe
1
所以最终我放弃了.NET Core,改用ASP.NET API 2来完成这个项目。我仍然没有找到如何允许.NET Core处理大于默认大小的文件的方法。我尝试过的所有链接都无法解决这个问题。API 2可以完美地工作 - 现在我只需要一个Windows托管环境... - Fred
.NET Standard 中是否有与 FormOptions 等效的选项,因为我的解决方案是基于 .NET Standard 的,而且我遇到了关于 HTML 表单的相同错误。 - Bercovici Adrian
4个回答

14

在我的情况下,解决方法是增加MemoryBufferThreshold。

services.Configure<FormOptions>(options =>
{
    options.MemoryBufferThreshold = Int32.MaxValue;
});

老而弥坚。谢谢!增加MultipartBodyLengthLimit并不足够,还必须增加内存缓冲区阈值。这种错误有点误导人,因为它无论如何都会说“超过了多部分体长度限制'16384'”。 - Brett

5
我遇到了一个异常情况,发现我的客户端的HTTP头“content-type”不正确。 使用具有错误输入类型的curl尝试将整个文件作为文本而不是POST正文发送,这不是一个好的做法:-)
使用curl的示例: 这是失败的:
curl --request POST \
  --url https://stuff.net/api/storage \
  --header 'authorization: bearer MY_ACCESS_TOKEN' \
  --header 'cache-control: no-cache' \
  --header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  --form MyfileName=b72871d79c81 \
  --form file=@nature-sky-twilight.jpg \
  --form MyfileId=9401c94db46c

这个方法是有效的:
curl --request POST \
  --url https://stuff.net/api/storage \
  --header 'authorization: bearer MY_ACCESS_TOKEN' \
  --header 'cache-control: no-cache' \
  --form MyfileName=b72871d79c81 \
  --form file=@nature-sky-twilight.jpg \
  --form MyfileId=9401c94db46c

2

您还需要增加值的长度限制。默认值大约为4MB。

              services.Configure<FormOptions>(options =>
                {
                    options.ValueCountLimit = 10; //default 1024
                    options.ValueLengthLimit = int.MaxValue; //not recommended value
                    options.MultipartBodyLengthLimit = long.MaxValue; //not recommended value
                });

1
是否有.NET StandardFormOptions等效项? 我遇到了同样的问题。 - Bercovici Adrian
ValueLengthLimitMultipartBodyLengthLimit的推荐值是多少? - Will Marcouiller
1
@WillMarcouiller 这将取决于您期望的上传有效负载,或者如果您有其他服务器端内容限制,您可以将其保留为MaxValues。但是,除非您有一些限制以防止人们上传大文件并被滥用,否则不建议使用它开箱即用,这可能会导致花费存储费用,并且可能会根据目标而填满您的磁盘,填充模糊数据。 - dynamiclynk
1
@dynamiclynk,我更好地理解了风险,谢谢。我将我的设置为60000000,就像OP设置的一样,现在我可以成功上传我的图片了。 :) - Will Marcouiller

0
在我的情况下,需要检查Postman中的Content-Type。

我也没有在任何地方设置断点,我从文件中获取我的数据。 - user15412298
真的很奇怪... - user15412298

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接