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

时间:2014-08-11 12:17:02

标签: php

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

413 Request Entity Too Large

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

然后我做了一个小黑客并尝试通过旧学校方法上传文件(iframe表单上传)并且它有效!有关如何使用AJAX base64字符串方法上传的任何帮助或建议都很棒。

EDIT-这是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.

1 个答案:

答案 0 :(得分:1)

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

Apache配置

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

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

查看Apache LimitRequestBody directive.

的完整描述

PHP配置

在PHP中,考虑了不同的限制:post_max_sizeupload_max_filesize(如果是文件上传)和memory_limitupload_max_filesize必须低于post_max_sizememory_limit必须低于;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

了Suhosin

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

{{1}}

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