web-dev-qa-db-fra.com

Convertir une chaîne Base64 en un fichier image?

J'essaie de convertir ma chaîne d'image base64 en un fichier image. Ceci est ma chaîne Base64:

http://Pastebin.com/ENkTrGNG

En utilisant le code suivant pour le convertir en un fichier image:

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

Mais je reçois une erreur de invalid image, qu'est-ce qui ne va pas ici?

121
Badal

Le problème est que data:image/png;base64, est inclus dans le contenu encodé. Cela entraînera des données d'image non valides lorsque la fonction base64 les décodera. Supprimez ces données dans la fonction avant de décoder la chaîne, comme ceci.

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

Vous devez supprimer la partie qui dit data:image/png;base64, au début des données d'image. Les données réelles en base64 viennent ensuite.

Il suffit de tout effacer jusqu'à base64, (avant d'appeler base64_decode() sur les données) et tout ira bien.

39
aaaaaa123456789

peut-être comme ça

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;
}
12
Shimon Doodkin

Un moyen facile que j'utilise:

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

Cela fonctionne bien car file_get_contents peut lire les données d'un URI, y compris un data: // URI.

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";
}
}
0
Sthish Visar

C’est un vieux fil, mais si vous voulez télécharger une image ayant la même 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));

Vous pouvez créer 'public_feeds' dans le système de fichiers de laravel.php-

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

Ce code a fonctionné pour moi.

<?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;
}
?>
0
Fazil Raza