Convert Base64 string to an image file?

PhpBase64

Php Problem Overview


I am trying to convert my base64 image string to an image file. This is my Base64 string:

http://pastebin.com/ENkTrGNG

Using following code to convert it into an image file:

function base64_to_jpeg( $base64_string, $output_file ) {
    $ifp = fopen( $output_file, "wb" ); 
    fwrite( $ifp, base64_decode( $base64_string) ); 
    fclose( $ifp ); 
    return( $output_file ); 
}

$image = base64_to_jpeg( $my_base64_string, 'tmp.jpg' );

But I am getting an error of invalid image, whats wrong here?

Php Solutions


Solution 1 - Php

The problem is that data:image/png;base64, is included in the encoded contents. This will result in invalid image data when the base64 function decodes it. Remove that data in the function before decoding the string, like so.

function base64_to_jpeg($base64_string, $output_file) {
    // open the output file for writing
    $ifp = fopen( $output_file, 'wb' ); 

    // split the string on commas
    // $data[ 0 ] == "data:image/png;base64"
    // $data[ 1 ] == <actual base64 string>
    $data = explode( ',', $base64_string );

    // we could add validation here with ensuring count( $data ) > 1
    fwrite( $ifp, base64_decode( $data[ 1 ] ) );

    // clean up the file resource
    fclose( $ifp ); 

    return $output_file; 
}

Solution 2 - Php

An easy way I'm using:

file_put_contents($output_file, file_get_contents($base64_string));

This works well because file_get_contents can read data from a URI, including a data:// URI.

Solution 3 - Php

You need to remove the part that says data:image/png;base64, at the beginning of the image data. The actual base64 data comes after that.

Just strip everything up to and including base64, (before calling base64_decode() on the data) and you'll be fine.

Solution 4 - Php

maybe like this

function save_base64_image($base64_image_string, $output_file_without_extension, $path_with_end_slash="" ) {
	//usage:  if( substr( $img_src, 0, 5 ) === "data:" ) {  $filename=save_base64_image($base64_image_string, $output_file_without_extentnion, getcwd() . "/application/assets/pins/$user_id/"); }		
	//
	//data is like:    data:image/png;base64,asdfasdfasdf
	$splited = explode(',', substr( $base64_image_string , 5 ) , 2);
	$mime=$splited[0];
	$data=$splited[1];
	
	$mime_split_without_base64=explode(';', $mime,2);
	$mime_split=explode('/', $mime_split_without_base64[0],2);
	if(count($mime_split)==2)
	{
		$extension=$mime_split[1];
		if($extension=='jpeg')$extension='jpg';
		//if($extension=='javascript')$extension='js';
		//if($extension=='text')$extension='txt';
		$output_file_with_extension=$output_file_without_extension.'.'.$extension;
	}
	file_put_contents( $path_with_end_slash . $output_file_with_extension, base64_decode($data) );
	return $output_file_with_extension;
}

Solution 5 - Php

That's an old thread, but in case you want to upload the image having same extension-

    $image = $request->image;
	$imageInfo = explode(";base64,", $image);
	$imgExt = str_replace('data:image/', '', $imageInfo[0]);      
	$image = str_replace(' ', '+', $imageInfo[1]);
	$imageName = "post-".time().".".$imgExt;
	Storage::disk('public_feeds')->put($imageName, base64_decode($image));

You can create 'public_feeds' in laravel's filesystem.php-

   'public_feeds' => [
        'driver' => 'local',
        'root'   => public_path() . '/uploads/feeds',
    ],

Solution 6 - Php

if($_SERVER['REQUEST_METHOD']=='POST'){
$image_no="5";//or Anything You Need
$image = $_POST['image'];
$path = "uploads/".$image_no.".png";

$status = file_put_contents($path,base64_decode($image));
if($status){
 echo "Successfully Uploaded";
}else{
 echo "Upload failed";
}
}

Solution 7 - Php

This code worked for me.

<?php
$decoded = base64_decode($base64);
$file = 'invoice.pdf';
file_put_contents($file, $decoded);

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?>

Solution 8 - Php

$datetime = date("Y-m-d h:i:s");
$timestamp = strtotime($datetime);
$image = $_POST['image'];
$imgdata = base64_decode($image);
$f = finfo_open();
$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);
$temp=explode('/',$mime_type);
$path = "uploads/$timestamp.$temp[1]";
file_put_contents($path,base64_decode($image));
echo "Successfully Uploaded->>> $timestamp.$temp[1]";

> This will be enough for image processing. Special thanks to Mr. Dev Karan Sharma

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBadalView Question on Stackoverflow
Solution 1 - PhpAustin BrunkhorstView Answer on Stackoverflow
Solution 2 - PhpHenry TrầnView Answer on Stackoverflow
Solution 3 - Phpaaaaaa123456789View Answer on Stackoverflow
Solution 4 - PhpShimon DoodkinView Answer on Stackoverflow
Solution 5 - Phpshubham sachanView Answer on Stackoverflow
Solution 6 - PhpSathish VisarView Answer on Stackoverflow
Solution 7 - PhpFazil RazaView Answer on Stackoverflow
Solution 8 - PhpManishView Answer on Stackoverflow