BugsDB
모든 문제

base64 데이터 문자열에서 PNG 이미지 서버 측을 저장하는 방법

나는 나이로gic의 'canvas2image' javascript 도구를 사용하여 그림을 PNG 그림으로 바꾸고 있습니다.PHP 를 사용하여 생성된 Base64 문자열을 서버에 있는 실제 PNG 파일로 바꾸는 것이 필요합니다.

간단히 말하자면, 현재 Cnvas2image를 클라이언트에서 파일을 생성하고 base64 인코딩을 검색하고, ajax 를 서버에 보내는 것을 사용합니다.

// Generate the image file
var image = Canvas2Image.saveAsPNG(canvas, true);   

image.id = "canvasimage";
canvas.parentNode.replaceChild(image, canvas);

var url = 'hidden.php',
data = $('#canvasimage').attr('src');

$.ajax({ 
    type: "POST", 
    url: url,
    dataType: 'text',
    data: {
        base64data : data
    }
});

이때, "hidden.php"은 마치 데이터 같은 데이터 블록: image /png;base64, ivborw0kgoaansuheugabe...

이 점에서 나는 거의 힘들다고 말했다.내가 읽은 바에 의하면 나는 php imagecreatefromstring 함수를 사용해야 한다고 믿지만 나는 어떻게 base64 인코딩의 문자열에 PNG 이미지를 실제 생성하고 서버에 저장할 수 있는지 모르겠다.도와 주세요!

대답

이 문자열에서 base64 그림 데이터를 추출하고 디스크에 저장하고 gd 를 필요로 하지 않기 때문에 png 입니다.

$data = 'data:image/png;base64,AAAFBfj42Pj4';

list($type, $data) = explode(';', $data);
list(, $data)      = explode(',', $data);
$data = base64_decode($data);

file_put_contents('/tmp/image.png', $data);

직선으로:

$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));

추출, 디코딩, 검사 오류의 효과적인 방법은:

if (preg_match('/^data:image\/(\w+);base64,/', $data, $type)) {
    $data = substr($data, strpos($data, ',') + 1);
    $type = strtolower($type[1]); // jpg, png, gif

    if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) {
        throw new \Exception('invalid image type');
    }

    $data = base64_decode($data);

    if ($data === false) {
        throw new \Exception('base64_decode failed');
    }
} else {
    throw new \Exception('did not match data URI with image data');
}

file_put_contents("img.{$type}", $data);