2017-09-30 2 views
-2

base64文字列をpng画像に変換しようとしましたが、開いたときにサーバに保存した後、 'Fatal error reading PNGイメージファイル:IDAT 'の圧縮解除エラーです。ここでBase64文字列を画像ファイルに変換するサーバに保存した後に無効な画像を返す

base64のデータ:ここ

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAgAElEQVR4nNy9aZMcx5EtCvRSVblnxh6Rey29YCVAguAOihQ5FEWRkijNkNSMlhk9XY3dazPP7txn9uz9+fM+eERWdrI532AwQ5mldaOqugF0x0n34+e4+53T8xMsr7PVKc5Wpzg5uzt9Pn/u9PwEJ2d3p9fDc+E9t32/5fc+X5/des1fOz0/ufHaJl5jtTmf/rzanPvnTrGJ1zhbnSLJYkTJBpt4jTiNsInXWKcrrJJzRMkKcbpGlGwQJRvERYK0ShAXEaJ8g3W6wiZbIyljxGmENI+wYTGSkq60ypBWGYoqRcZSFCpDxgtkIkMq1ih0gkxkyMsEJd+AyRi5zJDzDBnLUcgKTFdgukTOUxQyQaZzcFNBWAZuGCpVQDiGQpQobAmmS3BToTQZKlUiFwmEy2FajarmUDaHqzmkKiE6hcJWUIajMCWEZihlgVLFyHQOoUsUKkcuM2QiRakLZCJFyhMkLEbK6f+V8hS5zJHyFHERTVdeJojyeLroZ0zXndf2cXIHJ2d3cff0Du6e3pkOaDic8wMbDnp47jaA3Dm5+T3mVzjU4bWz1emPDnz4uNqc4+Ts7vTcEhzraDU9v47OcB6fTSCg51Y3rijZ+M/PkGQbJNkGaR4hK2JkBQEgyjfYZGtsMv+L98DJGB0YOugpcpaiEDkqVSKtPCh4ilLmyBh9ZP7KeUpfxzOUugTTFUpdojIVSlmgEBkqVaBSBZimw81liVLmqEwJ7Ti04/QeUyLjMXTLoWoBZThsI2EbCdNIyEaCOw7hmAdchUoV4LZAVTNUgoCRiQy5ZqhUhrSKkbEEOU+RsARJldBHf8VFNN1Ekmwz/UySMp1uIq81QEIkmF/zQ73anOPs7HjA56+dnN2dnrt7eudHd/4AqPC++WtzEMyBOAfNPIIEQISP4evjNKJDHZ9jHZ1hE9[…] 

PHPコード

$f = $handler->sanitizer($_POST['file']); 
$file = $handler->sanitizer($_POST['files']); 
$desc = $handler->sanitizer($_POST['desc']); 
$d = $handler->sanitizer($_POST['tm']); 
$status = 'Sorry something went wrong please try again'; 
$file_data = ''; 
$data = $file; 

if(!empty($f) && !empty($file)){ 
    /** 
    * file to be saved 
    */ 
    $dir = "../users/$un/profiles/"; 

    $file = explode(";base64,", $file); 
    $type_aux = explode("image/", $file[0]); 
    $type = $type_aux[1]; 
    $filename = "fr".substr(sha1(microtime()),0,20).'.'.$type; 


    $new_file = $dir.$filename; 

    /** 
    * saving and decoding file 
    */ 
    $upload = file_put_contents($new_file, 
     base64_decode(preg_replace("#^data:image/\w+;base64,#i", '', $data))); 

    if($upload){ 
     chmod($new_file,0777); 
     $status = 'changed'; 
     $file_data = str_replace('..','',$filename); 

     $f = explode('/',$f); 
     $f = end($f); 
     $path = "../users/$un/profiles/$f"; 
     $handler->Delete($path); 
    } 

} 


echo json_encode(array('status'=>$status,'file'=>$file_data)); 
+1

です。 '[...]'は有効ではありませんbase64 – glennsl

+0

@glennsl base64データ、上記で投稿しました。ウェブコンソールからコピーしました。[...]は、データを返して、base64イメージでは完璧に動作します。 –

+0

それなら、それをなぜ含めて、それだけではないと言いますか?また、[mcve] – glennsl

答えて

1

は私が+記号で、BASE64を交換した後に見つかったスペースを置き換えることで問題を解決しました

str_replace( ""、 "+"、$ d ata);

ここで更新PHPコードは、あなたが投稿したbase64文字列が不完全である

$f = $handler->sanitizer($_POST['file']); 
$file = $handler->sanitizer($_POST['files']); 
$desc = $handler->sanitizer($_POST['desc']); 
$d = $handler->sanitizer($_POST['tm']); 
$status = 'Sorry something went wrong please try again'; 
$file_data = ''; 
$data = $file; 

if(!empty($f) && !empty($file)){ 
    /** 
    * file to be saved 
    */ 
    $dir = "../users/$un/profiles/"; 

    $file = explode(";base64,", $file); 
    $type_aux = explode("image/", $file[0]); 
    $type = $type_aux[1]; 
    $filename = "fr".substr(sha1(microtime()),0,20).'.'.$type; 


    $new_file = $dir.$filename; 
    $data = preg_replace("#^data:image/\w+;base64,#i", '', $data); 

    /** 
    * Replace the space found in the data with + sign to work 
    */ 

    $data = str_replace(' ','+',$data); 


    /** 
    * saving and decoding file 
    */ 
    $upload = file_put_contents($new_file, 
     base64_decode($data)); 

    if($upload){ 
     chmod($new_file,0777); 
     $status = 'changed'; 
     $file_data = str_replace('..','',$filename); 

     $f = explode('/',$f); 
     $f = end($f); 
     $path = "../users/$un/profiles/$f"; 
     $handler->Delete($path); 
    } 

} 


echo json_encode(array('status'=>$status,'file'=>$file_data)); 
関連する問題