복붙노트

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

PHP

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

캔바스 그림을 PNG 이미지로 변환하기 위해 Nihilogic의 "Canvas2Image"JavaScript 도구를 사용하고 있습니다. 지금 필요한 것은이 도구가 생성하는 base64 문자열을 PHP를 사용하여 서버의 실제 PNG 파일로 변환하는 것입니다.

간단히 말해, 현재 내가하고있는 것은 Canvas2Image를 사용하여 클라이언트 측에서 파일을 생성 한 다음 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, iVBORw0KGgoAAAANSUhEUgAABE ...

이 시점부터, 나는 꽤 많이 난처한 상황이다. 필자가 읽은 바로는 PHP의 imagecreatefromstring 함수를 사용해야한다고 생각하지만 실제로 base64 인코딩 문자열에서 실제 PNG 이미지를 만들고 내 서버에 저장하는 방법을 모르겠습니다. 도와주세요!

해결법

  1. ==============================

    1.해당 문자열에서 base64 이미지 데이터를 추출하여 디코드 한 다음 디스크에 저장할 수 있으므로 이미 PNG이므로 GD가 필요하지 않습니다.

    해당 문자열에서 base64 이미지 데이터를 추출하여 디코드 한 다음 디스크에 저장할 수 있으므로 이미 PNG이므로 GD가 필요하지 않습니다.

    $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);
    
  2. ==============================

    2.이 시도:

    이 시도:

    file_put_contents('img.png', base64_decode($base64string));
    

    file_put_contents 워드 프로세서

  3. ==============================

    3.공백을 더하기 기호 str_replace ( '', '+', $ img)로 대체해야했습니다. 이 일을하기 위해서.

    공백을 더하기 기호 str_replace ( '', '+', $ img)로 대체해야했습니다. 이 일을하기 위해서.

    전체 코드는 다음과 같습니다.

    $img = $_POST['img']; // Your data 'data:image/png;base64,AAAFBfj42Pj4';
    $img = str_replace('data:image/png;base64,', '', $img);
    $img = str_replace(' ', '+', $img);
    $data = base64_decode($img);
    file_put_contents('/tmp/image.png', $data);
    

    희망이 도움이됩니다.

  4. ==============================

    4.토론 주제는 RFC 2397에 문서화되어 있습니다 - "데이터"URL 스키마 (https://tools.ietf.org/html/rfc2397)

    토론 주제는 RFC 2397에 문서화되어 있습니다 - "데이터"URL 스키마 (https://tools.ietf.org/html/rfc2397)

    이 PHP 때문에 이러한 데이터를 처리 할 수있는 고유 한 방법이 있습니다. "data : stream wrapper"(http://php.net/manual/en/wrappers.data.php)

    따라서 PHP 스트림을 사용하여 데이터를 쉽게 조작 할 수 있습니다.

    $data = 'data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7';
    
    $source = fopen($data, 'r');
    $destination = fopen('image.gif', 'w');
    
    stream_copy_to_stream($source, $destination);
    
    fclose($source);
    fclose($destination);
    
  5. ==============================

    5.위의 솔루션은 이미지가 jpeg 파일에 의존합니다. 내가 사용하는 일반적인 해결책

    위의 솔루션은 이미지가 jpeg 파일에 의존합니다. 내가 사용하는 일반적인 해결책

    $img = $_POST['image'];
    $img = substr(explode(";",$img)[1], 7);
    file_put_contents('img.png', base64_decode($img));
    
  6. ==============================

    6.@ dre010 아이디어를 사용하여 이미지 유형 (PNG, JPG, JPEG 또는 GIF)과 함께 작동하는 다른 함수로 확장했으며 파일 이름에 고유 한 이름을 부여합니다.

    @ dre010 아이디어를 사용하여 이미지 유형 (PNG, JPG, JPEG 또는 GIF)과 함께 작동하는 다른 함수로 확장했으며 파일 이름에 고유 한 이름을 부여합니다.

    이 기능은 이미지 데이터와 이미지 유형을 분리합니다.

    function base64ToImage($imageData){
        $data = 'data:image/png;base64,AAAFBfj42Pj4';
        list($type, $imageData) = explode(';', $imageData);
        list(,$extension) = explode('/',$type);
        list(,$imageData)      = explode(',', $imageData);
        $fileName = uniqid().'.'.$extension;
        $imageData = base64_decode($imageData);
        file_put_contents($fileName, $imageData);
    }
    
  7. ==============================

    7.이 시도...

    이 시도...

    $file = $_POST['file']; //your data in base64 'data:image/png....';
    $img = str_replace('data:image/png;base64,', '', $file);
    file_put_contents('img/imag.png', base64_decode($img));
    
  8. ==============================

    8.1 선형 솔루션.

    1 선형 솔루션.

    $base64string = 'data:image/png;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7';
    file_put_contents('img.png', base64_decode(explode(',',$base64string)[1]));
    
  9. ==============================

    9.총 관심사 :

    총 관심사 :

    $data = 'data:image/png;base64,AAAFBfj42Pj4';
    
    // Extract base64 file for standard data
    $fileBin = file_get_contents($data);
    $mimeType = mime_content_type($data);
    
    // Check allowed mime type
    if ('image/png'==$mimeType) {
        file_put_contents('name.png', $fileBin);
    }
    
  10. ==============================

    10.이 코드는 나를 위해 아래의 코드를 확인 작동합니다.

    이 코드는 나를 위해 아래의 코드를 확인 작동합니다.

    <?php
    define('UPLOAD_DIR', 'images/');
    $image_parts = explode(";base64,", $_POST['image']);
    $image_type_aux = explode("image/", $image_parts[0]);
    $image_type = $image_type_aux[1];
    $image_base64 = base64_decode($image_parts[1]);
    $file = UPLOAD_DIR . uniqid() . '.png';
    file_put_contents($file, $image_base64);
    ?>
    
  11. ==============================

    11.drew010 예제를 기반으로 저는 쉽게 이해할 수 있도록 실제 예제를 만들었습니다.

    drew010 예제를 기반으로 저는 쉽게 이해할 수 있도록 실제 예제를 만들었습니다.

    imagesaver("data:image/jpeg;base64,/9j/4AAQSkZJ"); //use full base64 data 
    
    function imagesaver($image_data){
    
        list($type, $data) = explode(';', $image_data); // exploding data for later checking and validating 
    
        if (preg_match('/^data:image\/(\w+);base64,/', $image_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');
        }
    
        $fullname = time().$type;
    
        if(file_put_contents($fullname, $data)){
            $result = $fullname;
        }else{
            $result =  "error";
        }
        /* it will return image name if image is saved successfully 
        or it will return error on failing to save image. */
        return $result; 
    }
    
  12. ==============================

    12.이 함수는 작동해야합니다. 새로운 사진을 저장하는 동안 링크를 해제하려는 기존 이미지가 이미있는 경우 base64 문자열을 보유하고있는 photo 매개 변수와 기존 이미지 디렉토리로의 경로가 있습니다.

    이 함수는 작동해야합니다. 새로운 사진을 저장하는 동안 링크를 해제하려는 기존 이미지가 이미있는 경우 base64 문자열을 보유하고있는 photo 매개 변수와 기존 이미지 디렉토리로의 경로가 있습니다.

     public function convertBase64ToImage($photo = null, $path = null) {
        if (!empty($photo)) {
            $photo = str_replace('data:image/png;base64,', '', $photo);
            $photo = str_replace(' ', '+', $photo);
            $photo = str_replace('data:image/jpeg;base64,', '', $photo);
            $photo = str_replace('data:image/gif;base64,', '', $photo);
            $entry = base64_decode($photo);
            $image = imagecreatefromstring($entry);
    
            $fileName = time() . ".jpeg";
            $directory = "uploads/customer/" . $fileName;
    
            header('Content-type:image/jpeg');
    
            if (!empty($path)) {
                if (file_exists($path)) {
                    unlink($path);
                }
            }
    
            $saveImage = imagejpeg($image, $directory);
    
            imagedestroy($image);
    
            if ($saveImage) {
                return $fileName;
            } else {
                return false; // image not saved
            }
        }
    }
    
  13. from https://stackoverflow.com/questions/11511511/how-to-save-a-png-image-server-side-from-a-base64-data-string by cc-by-sa and MIT license