Javascript 如何将base64编码的图像正确上载到文件服务器?

Javascript 如何将base64编码的图像正确上载到文件服务器?,javascript,php,jquery,validation,encoding,Javascript,Php,Jquery,Validation,Encoding,我正在使用JQuery插件裁剪和上传照片。选择照片后的插件返回base64编码图像。如下:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA… 我使用Ajax将其发送到PHP,如下所示: $.ajax({ type: 'post', url: 'upload.php', data: $('form').serialize(), success: function (data) { $('.image-

我正在使用JQuery插件裁剪和上传照片。选择照片后的插件返回base64编码图像。如下:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA…

我使用Ajax将其发送到PHP,如下所示:

$.ajax({
    type: 'post',
    url: 'upload.php',
    data: $('form').serialize(),
    success: function (data) {      
        $('.image-editor').cropit('imageSrc', 'images/' + data );
        $('#change').css("background-image", "url('images/" + data + "')");
        modal.style.display = "none";
    }
});
如何通过PHP正确验证图像并将其存储到文件服务器

目前,我使用的PHP是这样的,它可以正常工作,但正如我之前读到的,这种方法不安全,也没有任何验证:

function decode ($code) {
    list($type, $code) = explode(';', $code);
    list(, $code)      = explode(',', $code);
    $code = base64_decode($code);

    file_put_contents('images/filename.jpg', $code); // there filename static for example
}
$testdata = $_POST["image-data"];
decode($testdata);

echo "filename.jpg";
我应该使用
move\u upload\u file()
而不是
file\u put\u contents()
?但我如何用base64编码图像实现它呢

我见过这样验证文件的方法,但我不知道如何将其用于base64编码图像:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 100000)
    && in_array($extension, $allowedExts)){

    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    } 
    else {
        $fileName = $temp[0].".".$temp[1];
        $temp[0] = rand(0, 3000); //Set to random number
        $fileName;

        if (file_exists("../img/imageDirectory/" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " already exists. ";
        }
        else {
            move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $_FILES["file"]["name"]);
            echo "Stored in: " . "../img/imageDirectory/" . $_FILES["file"]["name"];
        }
    }
}
else {
    echo "Invalid file";
}
$allowedExts=array(“gif”、“jpeg”、“jpg”、“png”);
$temp=explode(“.”,$_文件[“文件”][“名称”]);
$extension=end($temp);
如果(($_文件[“文件”][“类型”]=“图像/gif”)
||($_文件[“文件”][“类型”]=“图像/jpeg”)
||($_文件[“文件”][“类型”]=“图像/jpg”)
||($_文件[“文件”][“类型”]=“图像/pjpeg”)
||($_文件[“文件”][“类型”]=“图像/x-png”)
||($_文件[“文件”][“类型”]=“图像/png”))
&&($_文件[“文件”][“大小”]<100000)
&&in_数组($extension$allowedExts)){
如果($\u文件[“文件”][“错误”]>0){
回显“返回代码:”.$\u文件[“文件”][“错误”]。
”; } 否则{ $fileName=$temp[0]。“..$temp[1]; $temp[0]=rand(0,3000);//设置为随机数 $fileName; 如果(文件存在(“../img/imageDirectory/”$\u文件[“文件”][“名称”])){ echo$\u文件[“文件”][“名称”]。“已存在。”; } 否则{ 移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\; echo“存储在:“.”../img/imageDirectory/“$\u文件[“文件”][“名称”]; } } } 否则{ 回显“无效文件”; }
尝试以下代码:

$encoded = $_POST['image-data'];
$exp = explode(',', $encoded);
$data = base64_decode($exp[1]);
$file = 'images/filename.jpg';
file_put_contents($file, $data);

你担心什么样的安全?@OliverCharlesworth我读过类似的问题,看到过这样的评论:最好使用
move\u uplated\u file()
而不是
file\u put\u contents()
,因为
move\u uplated\u file()
检查它是否是文件或类似的东西,还说这是更安全的上传方式。真的,我不知道这是不是真的。你发送简单的帖子数据(数据:url)。您不发送和文件,这就是为什么不能使用
move\u uploaded\u file()
。在这种情况下,您只能检查数据类型(mime,在此字符串中给出)并将解码后的数据保存到文件中。当然,您也可以使用给定值检查“保存图像类型”。@Vitaly您能否提供一个使用
文件\u put\u contents()
”验证的示例?将解码数据保存到临时文件并调用
getimagesize
()。比较哑剧。此外,您还可以检查函数
getimagesize
(失败时为FALSE)和
base64_decode
(失败时为FALSE)的返回值。通过验证后,您可以将该文件移动到存储目录。