Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php |验证base64 |解码为图像|不工作_Php_Jquery - Fatal编程技术网

Php |验证base64 |解码为图像|不工作

Php |验证base64 |解码为图像|不工作,php,jquery,Php,Jquery,我创建了一个函数,该函数将返回所提供的base64_decode参数的文件类型。如果不是图像,函数将返回false。但是,当传入编码图像时(通过jquery ajax(FormData对象))函数每次都返回false。我试过很多东西,但都没能奏效 编辑:我现在得到一个Javascript错误,它是: “未捕获的语法错误:意外标记� 在JSON中的位置0“ 客户 然后我将表单数据传递到ajax中。正如Jonathan Kuhn所说 使用imagecreate*函数创建图像后,无论输入格式是什么,都

我创建了一个函数,该函数将返回所提供的base64_decode参数的文件类型。如果不是图像,函数将返回false。但是,当传入编码图像时(通过jquery ajax(FormData对象))函数每次都返回false。我试过很多东西,但都没能奏效

编辑:我现在得到一个Javascript错误,它是:
“未捕获的语法错误:意外标记� 在JSON中的位置0“

客户 然后我将表单数据传递到ajax中。

正如Jonathan Kuhn所说


使用imagecreate*函数创建图像后,无论输入格式是什么,都可以输出任何类型的图像,如png、jpg、gif。创建图像意味着扩展可以操作GD格式的图像,然后以其理解的任何图像格式输出

因此,您的方法是错误的,您可以使用finfo_*函数获得解码base64的MIME类型

例如:

$base64 = base64_decode($base64);
$finfo_handler = finfo_open();
$allowed_types = ["image/jpeg","image/png","image/gif"];
$mime_type = finfo_buffer($finfo_handler, $base64, FILEINFO_MIME_TYPE);
finfo_close($finfo_handler);
if(!in_array($mime_type, $allowed_types)){
    // Mime Type is not JPEG or PNG or GIF
    return false;
}else{
    // Mime Type is in Array and returns first index of exploded string by "/" char.
    // That means for image/jpeg exploded_array = [ 0 => "image", 1 => "jpeg"]
    // and it returns first index "jpeg" for "image/png" it returns "png"
    return explode("/", $mime_type)[1];
}

使用任何
imagecreate*
函数创建图像后,无论输入格式是什么,都可以输出任何类型的图像,如
png
jpg
gif
。创建图像意味着扩展可以使用
GD
格式进行操作,然后以它理解的任何图像格式输出。另外,您是否有正在解码的图像数据的示例?如果我没记错的话,像这样从ajax发送的数据包括一个内容类型。如果你不把它去掉,你会得到坏的
base64\u解码
'd数据。这意味着您无法从中创建图像。@JonathanKuhn我用相关的客户端代码更新了问题。好的,
toDataURL
包括内容类型,如
data:image/png;base64,
。您需要在尝试
base64\u解码
之前删除它,因为这是数据url所必需的,但不是
base64\u编码
'd数据的一部分。因此,
base64\u decode
将为图像返回一些其他无效的二进制数据。@JonathanKuhn如果我是ajaxing.png、.gif和.jpg怎么办?与中一样,这取决于用户上载的文件类型。我将在toDataURL中传递什么?另外,您是说我应该从$base64变量中删除传递到该方法中的文本?这是否解释了人们在非图像文件上添加.png扩展名的原因?这不算,因为“文件扩展名”和“文件格式”是不同的。Base64编码不提供编码文件名,它提供格式化文件数据的Base64编码字符串。但它安全吗?是的。正如我所说的,finfo会像浏览器一样检查字符串的格式头。当从ajax执行代码时,我收到一个内部错误500:\
var cropCanvas = $('#user-img').cropper('getCroppedCanvas');
var cropImg = cropCanvas.toDataURL("image/jpeg");
var formData = new FormData();
formData.append('pic', cropImg);
$base64 = base64_decode($base64);
$finfo_handler = finfo_open();
$allowed_types = ["image/jpeg","image/png","image/gif"];
$mime_type = finfo_buffer($finfo_handler, $base64, FILEINFO_MIME_TYPE);
finfo_close($finfo_handler);
if(!in_array($mime_type, $allowed_types)){
    // Mime Type is not JPEG or PNG or GIF
    return false;
}else{
    // Mime Type is in Array and returns first index of exploded string by "/" char.
    // That means for image/jpeg exploded_array = [ 0 => "image", 1 => "jpeg"]
    // and it returns first index "jpeg" for "image/png" it returns "png"
    return explode("/", $mime_type)[1];
}