我正在尝试使用FileReader API上传图片,并使用服务器端的PHP将FileReader.readAsDataURL()
方法中的数据URL写入文件。
该方法适用于较小的图像(不确定究竟有多小,但<1MB可能相当精确)。但是,在上传较大的图像时,我收到413请求实体太大的错误。我看到了this question并尝试了两种解决方案,但第一次没有做任何事情,第二次给出了500错误。当我检查错误日志时,它说:
/home/username/public_html/.htaccess: LimitRequestFieldsize not allowed here
为什么这不起作用?
的php.ini
file_uploads = On
post_max_size = 50M
upload_max_filesize = 50M
的.htaccess
RewriteEngine On
# LimitRequestFieldSize 2097152
SSLRenegBufferSize 1000000
JS
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
$.ajax({
url: "?action=saveImg",
type: "POST",
dataType: "json",
data: {
image: e.target.result,
id: id
},
success: function(data){
$.dialog(data.message, data.title);
}
});
}
for(var i = 0; i < input.files.length; i++){
reader.readAsDataURL(input.files[i]);
}
}
}
$("#file").change(function() {
readURL(this);
});
PHP
$id = $_POST["id"];
$filetype = str_replace('data:', '', explode(";", $_POST["image"])[0]);
$data = $_POST["image"];
list($type, $data) = explode(';', $data);
list(, $data) = explode(',', $data);
$data = base64_decode($data);
$rand = random_str(6);
$ext = explode("/", $filetype)[1];
if(!is_dir("../../images/product/{$id}/")){
mkdir("../../images/product/{$id}/");
}
$fh = fopen("../../images/product/{$id}/{$rand}.{$ext}", "w+");
fwrite($fh, $data);
fclose($fh);
$return = ["message" => "ID is $id. Saved image as /images/product/{$id}/{$rand}.{$ext}.", "title" => "Saved Image", "image" => "/images/product/{$id}/{$rand}.{$ext}"];
echo json_encode($return);
die();
我该如何做到这一点?
答案 0 :(得分:-1)
除了LimitRequestFieldsize
之外,这个问题有很多可能的原因。
首先,必须在.conf
文件中设置LimitRequestFieldsize ,而不是.htaccess
。此外,增加限制会产生重大的安全隐患。 (缓慢的洛里斯攻击一个人)
还必须在.conf
文件中设置。也有安全隐患。
SecRequestBodyLimit 10485760