169 votes

Convertir une chaîne de caractères Base64 en un fichier image ?

J'essaie de convertir ma chaîne d'images base64 en un fichier image. Voici ma chaîne en base64 :

http://pastebin.com/ENkTrGNG

Utiliser 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 ?

300voto

Austin Brunkhorst Points 6729

Le problème est que data:image/png;base64, est inclus dans le contenu codé. Il en résultera des données d'image invalides lorsque la fonction base64 les décodera. Supprimez ces données dans la fonction avant de décoder la chaîne, comme suit.

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

68voto

Henry Trần Points 758

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 des données à partir d'un URI, y compris un URI data://.

53voto

aaaaaa123456789 Points 1251

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

Dépouillez tout jusqu'à et y compris base64, (avant d'appeler base64_decode() sur les données) et tout ira bien.

20voto

Shimon Doodkin Points 574

Peut-être comme ceci

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

10voto

shubham sachan Points 119

C'est un vieux sujet, mais au cas où vous voudriez 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 fichier filesystem.php de Laravel.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X