বেস 64 ডেটা স্ট্রিং থেকে কীভাবে পিএনজি চিত্র সার্ভার-সাইড সংরক্ষণ করতে হয়


212

ক্যানভাস অঙ্কনগুলিকে পিএনজি চিত্রগুলিতে রূপান্তর করতে আমি নিহিলোগিকের "ক্যানভাস 2 আইমেজ" জাভাস্ক্রিপ্ট সরঞ্জামটি ব্যবহার করছি। আমার এখন যা দরকার তা হল পিএইচপি ব্যবহার করে সার্ভারের প্রকৃত পিএনজি ফাইলগুলিতে এই সরঞ্জামটি তৈরি করে এমন বেস 64 স্ট্রিংগুলি ঘুরিয়ে দেওয়া।

সংক্ষেপে, আমি বর্তমানে যা করছি তা হ'ল ক্যানভাস 2 আইমেজ ব্যবহার করে ক্লায়েন্ট সাইডে একটি ফাইল তৈরি করা, তারপরে বেস 64-এনকোডড ডেটা উদ্ধার করুন এবং এজেএক্স ব্যবহার করে এটি সার্ভারে প্রেরণ করুন:

// 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
    }
});

এই মুহুর্তে, "লুকানো.এফপি" একটি ডেটা ব্লক গ্রহণ করে যা ডেটার মতো দেখায় : চিত্র / পিএনজি; বেস 64, iVBORw0KGgoAAAAUUEEUGAABE ...

এই দিক থেকে, আমি বেশ স্টাম্পড। আমি যা পড়েছি তা থেকে, আমি বিশ্বাস করি যে আমার পিএইচপি-র চিত্র - ক্রিয়েটফ্রমস্ট্রিং ফাংশনটি ব্যবহার করার কথা , তবে আমি নিশ্চিত না যে কীভাবে আসল পিএনজি চিত্রটি বেস 64-এনকোড স্ট্রিং থেকে তৈরি করতে হবে এবং এটি আমার সার্ভারে সঞ্চয় করতে হবে। সাহায্য করুন!


আপনার এটি পার্স করা উচিত। আপনি সেখান থেকে চিত্রের প্রকারটি বের করতে পারেন এবং তারপরে base64_decode ব্যবহার করতে পারেন এবং আপনার চিত্রের ধরণের মাধ্যমে কোনও ফাইলটিতে স্ট্রিংটি সংরক্ষণ করতে পারেন
কনস্টান্টিন

@ কনস্ট্যান্টাইন আপনি কি আরও নির্দিষ্ট হতে পারেন, দয়া করে?
আন্দ্রে ওনিগা

7
$ ডেটা = $ _REQUEST ['বেস64ডাটা']; $ চিত্র = বিস্ফোরিত ('বেস 64,', $ ডেটা); ফাইল_পুট_কন্টেন্টস ('img.png', বেস 64_ ডেকোড ($ চিত্র [1]));
কনস্টান্টিন

আপনি স্ন্যাপশট থেকে এবং ডেটা না পাঠানো পর্যন্ত পুরো কোডটি পোস্ট করতে পারেন, এটি আমার পক্ষে কার্যকর নয়।
অফির আটিয়া

উত্তর:


437

আপনাকে সেই স্ট্রিং থেকে বেস 64 ইমেজ ডেটা বের করতে হবে, এটিকে ডিকোড করুন এবং তারপরে আপনি এটি ডিস্কে সংরক্ষণ করতে পারেন, আপনার জিডি লাগবে না কারণ এটি ইতিমধ্যে পিএনজি রয়েছে is

$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);

আপনার উদাহরণটি টাইপ। সেই মানটি কী হওয়া উচিত?
জন

1
@ জোন $typeবিস্ফোরক থেকে একটি মান নির্ধারণ করে, তার ডেটা: চিত্র /
জেপিজি

আমি এই ত্রুটিটি পেয়েছি: বিকৃত utf-8 টি অক্ষর সম্ভবত ভুলভাবে এনকোড করেছে আমার কী করা উচিত?
আলডো

@ আলডো সম্ভবত কোড এবং বিশদ সহ একটি নতুন প্রশ্ন পোস্ট করুন। আপনার বার্তাটি না দেখে বা কীভাবে চিত্রটি এনকোড করা হয়েছে এবং কীভাবে এটি স্ক্রিপ্টে প্রেরণ করা হয়েছে তা না জানিয়ে কেবল সেই বার্তার উপর ভিত্তি করে বলা অসম্ভব অসম্ভব।
ড্রয়িং 10

120

এটা চেষ্টা কর:

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

file_put_contents ডক্স


4
আমি এটি চেষ্টা করেছিলাম কিন্তু এটি data:image/png;base64,ফাইলটি ভাঙ্গার সাথে যুক্ত করে।
মাইকেল জে। ক্যালকিনস

2
@ মিশেলক্যালকিন্স এটি আমার জন্যও বিরতি দেয়। dru010 এর উত্তরটি কেবলমাত্র সমাধানটি ধারাবাহিকভাবে কাজ করে বলে মনে হচ্ছে।
ডেভিড জন ওয়েলশ

24
আপনি যদি data:image/png;base64,সেই স্ট্রিংটি অন্তর্ভুক্ত করছেন তবে আপনি যে স্ট্রিংটি দিয়ে যাচ্ছেন base64_decodeতা বেইজ বেস নয়। আপনাকে কেবল ডেটা প্রেরণ করতে হবে, যা ড্র -010 এর উত্তর চিত্রিত করছে। এই উত্তর দিয়ে কিছু ভাঙ্গা নেই। আপনি বুঝতে না পেরে অনুলিপি এবং পেস্ট করতে পারবেন না এবং এটি "স্রেফ কাজ" করার প্রত্যাশা করতে পারেন।
সাইফার

4
প্রশ্নে প্রদত্ত উদাহরণের জন্য কাজ না করা যা কোনও বেস 64 সামগ্রী নয় এবং প্রথমে টুকরো টুকরো করা উচিত (স্বীকৃত উত্তর দেখুন)।
বেনিয়ামিন পাইট 26'15

আমার চিত্রটি সাফল্যের সাথে সংরক্ষিত হয়েছে। তবে আমি যখন চিত্রটির ইউআরএল লিখি তখন একটি ফাঁকা চিত্র দেখতে পাই। আমি নিশ্চিত যে আমার ডেটা ইউআরএল সঠিক, কারণ আমি এটি উইন্ডো.ওপেন (ডেটাআরএল) ব্যবহার করে পরীক্ষা করেছি। খালি ছবি কেন?
পার্থো

45

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);

আশা করি এইটি কাজ করবে.


1
আপনার লাইন $img = str_replace(' ', '+', $img);আমাকে অনেক সাহায্য করেছে, ধন্যবাদ! আমাকে কেন আগে স্থানটি "+" তে রূপান্তর করতে হবে?
সোভেন

19

এটি বলাই বাহুল্য যে আলোচিত বিষয়টি আরএফসি 2397 - "ডেটা" ইউআরএল স্কিমে ( https://tools.ietf.org/html/rfc2397 ) নথিভুক্ত করা হয়েছে

এই পিএইচপি-এর কারণে এই জাতীয় ডেটা - "ডেটা: স্ট্রিম র‌্যাপার" হ্যান্ডেল করার একটি স্থানীয় উপায় রয়েছে ( http://php.net/manual/en/wrappers.data.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);

2
আমি এই উত্তরটি পছন্দ করি, এর আরও বেশি ভোট হওয়া উচিত, এটি দেশীয় ফাংশনগুলি ব্যবহার করে, কোনও নোংরা বাড়ির তৈরি ডেটা ম্যানিপুলেশন! যদিও, অভিনয় সম্পর্কে কোন ধারণা? এটি দ্রুত বেশি, যেমন এক আশা করতে পারে, preg_replace+ + file_put_contents?
বনসোয়ার

1
@ বনসওয়ার ধন্যবাদ আপনার প্রশ্ন সম্পর্কে: আমার মতে আপনার অ্যাপ্লিকেশনটির পারফরম্যান্সের সমস্যা না পেয়েছে তা নিশ্চিত করার সর্বোত্তম উপায় হ'ল আপনার বিশেষ ক্ষেত্রে (পরিবেশ, প্রত্যাশিত এবং অনুমোদিত ফাইলের আকারের উপর ভিত্তি করে) এর কার্যকারিতা পরিমাপ করা। আমরা এখানে কোড দিয়ে খেলতে এবং উত্তরে সংখ্যাগুলি দেখানোর চেষ্টা করতে পারি, তবে সত্য সত্য যে আপনার সঠিক ক্ষেত্রে এটি ইতিবাচক ফলাফলের চেয়ে বেশি ক্ষতি নিয়ে আসতে পারে। নিজের নিজের বিষয়ে নিশ্চিত করা সর্বদা ভাল (বিশেষত যদি আমরা অ্যাপ্লিকেশনটির পারফরম্যান্স-সমালোচনা অংশে কথা বলি)।
ভ্লাদিমির পোসভিস্টেলিক

11

ভাল আপনার উপরের সমাধানটি ছবিটির উপর নির্ভর করে একটি জেপিগ ফাইল। একটি সাধারণ সমাধানের জন্য আমি ব্যবহার করেছি

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

11

@ Dre010 ধারণাটি গ্রহণ করে, আমি এটিকে অন্য ফাংশনে প্রসারিত করেছি যা কোনও চিত্রের ধরণের সাথে কাজ করে: পিএনজি, জেপিজি, জেপিজি বা জিআইএফ এবং ফাইল নামটিতে একটি অনন্য নাম দেয়

ফাংশনটি পৃথক চিত্রের ডেটা এবং চিত্রের ধরণ

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);
}


5

এক-লিনিয়ার সমাধান।

$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]));

5

ড্রউ010 উদাহরণের উপর ভিত্তি করে আমি সহজ বোঝার জন্য একটি কার্যকারী উদাহরণ তৈরি করেছি।

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; 
}

4

এটা চেষ্টা কর...

$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));

4

এই কোডটি কোডটি নীচে যাচাই করে আমার জন্য কাজ করে:

<?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);
?>

0

এই ফাংশনটি কাজ করা উচিত। এটিতে ফটো প্যারামিটার রয়েছে যা বেস 64৪ স্ট্রিংটি ধারণ করে এবং একটি বিদ্যমান চিত্র ডিরেক্টরিতে যাওয়ার পথ আপনার যদি ইতিমধ্যে নতুন চিত্রটি সংরক্ষণ করার সময় আপনার লিঙ্কমুক্ত করতে চান এমন একটি বিদ্যমান চিত্র থাকা উচিত।

 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
        }
    }
}

0

ইহা সহজ :

আসুন কল্পনা করুন যে আপনি জেএস ফ্রেমওয়ার্ক, এজাক্স অনুরোধ বা মোবাইল অ্যাপ্লিকেশন (ক্লায়েন্ট পক্ষ) এর মধ্যে একটি ফাইল আপলোড করার চেষ্টা করছেন

  1. প্রথমত আপনি একটি ডেটা অ্যাট্রিবিউট প্রেরণ করেন যা একটি বেস 64 এনকোড স্ট্রিং ধারণ করে।
  2. সার্ভার সাইডে আপনাকে এটিকে ডিকোড করতে হবে এবং একটি স্থানীয় প্রকল্প ফোল্ডারে সংরক্ষণ করতে হবে।

এখানে পিএইচপি ব্যবহার করে এটি কীভাবে করবেন

<?php 

$base64String = "kfezyufgzefhzefjizjfzfzefzefhuze"; // I put a static base64 string, you can implement you special code to retrieve the data received via the request.

$filePath = "/MyProject/public/uploads/img/test.png";

file_put_contents($filePath, base64_decode($base64String));

?>

0

আপনি যদি এলোমেলোভাবে চিত্রগুলির নাম পরিবর্তন করতে চান এবং ডাটাবেসে ইমেজ পাথ দুটি ব্লক হিসাবে এবং ইমেজটি নিজেই ফোল্ডারে সঞ্চয় করতে চান তবে এই সমাধান আপনাকে সহায়তা করবে। আপনার ওয়েবসাইট ব্যবহারকারীরা যতগুলি ইচ্ছাগুলি চান তা সংরক্ষণ করতে পারবেন যখন সুরক্ষা উদ্দেশ্যে ছবিগুলি এলোমেলোভাবে নামকরণ করা হবে।

পিএইচপি কোড

চিত্রের নাম হিসাবে ব্যবহার করতে এলোমেলো ভারচারগুলি তৈরি করুন।

function genhash($strlen) {
        $h_len = $len;
        $cstrong = TRUE;
        $sslkey = openssl_random_pseudo_bytes($h_len, $cstrong);
        return bin2hex($sslkey);
}
$randName = genhash(3); 
#You can increase or decrease length of the image name (1, 2, 3 or more).

চিত্র থেকে চিত্রের ডেটা এক্সটেনশন এবং বেস_64৪ অংশ (ডেটার পরে অংশ: চিত্র / পিএনজি; বেস64,) পান।

$pos  = strpos($base64_img, ';');
$imgExten = explode('/', substr($base64_img, 0, $pos))[1];
$extens = ['jpg', 'jpe', 'jpeg', 'jfif', 'png', 'bmp', 'dib', 'gif' ];

if(in_array($imgExten, $extens)) {

   $imgNewName = $randName. '.' . $imgExten;
   $filepath = "resources/images/govdoc/".$imgNewName;
   $fileP = fopen($filepath, 'wb');
   $imgCont = explode(',', $base64_img);
   fwrite($fileP, base64_decode($imgCont[1]));
   fclose($fileP);

}

# => $filepath <= This path will be stored as blob type in database.
# base64_decoded images will be written in folder too.

# Please don't forget to up vote if you like my solution. :)

0

পিএইচপি এর ইতিমধ্যে একটি সুষ্ঠু চিকিত্সা বেস 64 -> ফাইল রূপান্তর রয়েছে

আমি এটি এইভাবে ব্যবহার করে সম্পন্ন করতে ব্যবহার করি:

$blob=$_POST['blob']; // base64 coming from an url, for example
$blob=file_get_contents($blob);
$fh=fopen("myfile.png",'w'); // be aware, it'll overwrite!
fwrite($fh,$blob);
fclose($fh);
echo '<img src=myfile.png>'; // just for the check
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.