doukanmang3687
2013-03-01 08:49
浏览 105
已采纳

将Base64字符串转换为图像文件?

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?

图片转代码服务由CSDN问答提供 功能建议

我正在尝试将base64图像字符串转换为图像文件。 这是我的Base64字符串:

http://pastebin.com/ENkTrGNG

使用以下代码将其转换为图像文件:

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

但是我收到无效的错误 图片,这里有什么不对吗?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • douchixu3686 2013-03-01 08:58
    已采纳

    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; 
    }
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • drjyvoi734793 2013-03-01 08:53

    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.

    评论
    解决 无用
    打赏 举报
  • douzou8074 2016-05-25 17:26

    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;
    }
    
    评论
    解决 无用
    打赏 举报
  • dtu36380 2017-10-12 11:44
    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";
    }
    }
    
    评论
    解决 无用
    打赏 举报
  • dqrdlqpo775594 2018-04-10 14:52

    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.

    评论
    解决 无用
    打赏 举报
  • duanji9378 2018-07-10 12:09
    $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

    评论
    解决 无用
    打赏 举报
  • douci2516 2018-12-31 17:39

    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',
        ],
    
    评论
    解决 无用
    打赏 举报
  • doureng5668 2019-08-21 06:41

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

    </div>
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题