使用 AJAX 发送数据时请求实体太大


Request Entity Too Large when data sent using AJAX

我正在使用JavaScript canvas API toDataURL()将图像文件转换为base64字符串,然后通过XMLHttpRequest或简单的AJAX请求将字符串传输到我的服务器。当我上传中等大小的文件(500KB-1MB(时,我收到以下错误-

413 Request Entity Too Large

我研究了很多。尝试更改post_max_sizeupload_max_size但这没有帮助。在一篇文章中,有人建议在 Apache 中设置 RequestBodyLength 的限制。但是我找不到办法

然后我做了一个小技巧,并尝试通过老式方法(iframe 表单上传(上传文件,它奏效了!关于如何使用 AJAX base64 字符串方法上传的任何帮助或建议都会很棒。

编辑 - 这是JavaScript代码,它首先将canvas元素转换为base64字符串,然后使用AJAX将其上传到服务器。

lab.newPost.submit = function(){
var url = 'upload.php';
var params = {
    'title': lab.newPost.elements.photo_form.title.val(),
    'imageData': Meme.canvas[0].toDataURL("image/jpeg"),  //Convert to Base64 data URL
    };
$.post(url,params, function(data){  //AJAX POST
    data = JSON.parse(data);
    if(data.success){
        Msg.success('<a href="#" class="alert-link">Awesome! </a> Thanks for contributing :)');
    }
    else{
      Msg.danger('<a href="#" class="alert-link">Error! </a>'+data.error[0]);
      }
    }).fail(function(xhr, ajaxOptions, thrownError) { //any errors?
    console.log(thrownError);  //This line give 
    });
}

调用返回以下行-

Request Entity Too Large
The requested resource
/upload.php
does not allow request data with POST requests, or the amount of data provided inthe request exceeds the capacity limit.

当客户端发送大于服务器能够处理的 POST 请求时,通常会生成413 Request Entity Too Large。这可能取决于物理资源或不同级别的设置。

阿帕奇配置

Apache 中的限制是通过 LimitRequestBody 指令设置的,默认为 0:

此指令指定请求正文中允许的从 0(表示无限(到 2147483647 (2GB( 的字节数。

看看 Apache 的 LimitRequestBody 指令的完整描述。

PHP 配置

在PHP中,考虑了不同的限制:post_max_sizeupload_max_filesize(如果是文件上传(和memory_limitupload_max_filesize必须低于post_max_size,必须低于memory_limit

苏霍辛

如果 PHP 在 Suhosin 的保护下运行,则更多配置细节可能会导致服务器因其大小而拒绝 POST:

;suhosin.post.max_array_depth = 100
;suhosin.post.max_array_index_length = 64
;suhosin.post.max_name_length = 64
;suhosin.post.max_totalname_length = 256
;suhosin.post.max_value_length = 1000000
;suhosin.post.max_vars = 1000

请注意,此处max_value_length正好介于上传的文件大小和 base64 版本之间。所以这可能是问题所在。请注意,在配置中,suhosin.get 和 suhosin.request 会出现相同的行。suhosin.request 值应等于或高于 get 和 post。