我使用JavaScript画布API toDataURL()
将图像文件转换为base64字符串,然后通过XMLHttpRequest或简单的AJAX请求将字符串传输到我的服务器。当我上传中等大小的文件(500KB-1MB)时,我收到以下错误 -
413 Request Entity Too Large
我研究了很多。尝试更改post_max_size
,upload_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.
答案 0 :(得分:1)
当客户端发送的POST请求大于服务器能够处理的POST请求时,通常会生成413 Request Entity Too Large
。这可能取决于物理资源或不同级别的设置。
Apache中的限制是通过LimitRequestBody指令设置的,默认为0:
该指令指定请求正文中允许的从0(表示无限制)到2147483647(2GB)的字节数。
查看Apache LimitRequestBody directive.
的完整描述在PHP中,考虑了不同的限制:post_max_size
,upload_max_filesize
(如果是文件上传)和memory_limit
。
upload_max_filesize
必须低于post_max_size
,memory_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
。
如果PHP在Suhosin的保护下运行,更多配置细节可能导致服务器因其大小而拒绝POST:
{{1}}
请注意,此处的max_value_length恰好位于上传文件大小和base64版本之间的中间位置。所以这可能是问题所在。请注意,在配置中,suhosin.get和suhosin.request会显示相同的行。 suhosin.request值应该等于或高于get和post。