2011-07-18 12 views
45

私はJavaScriptから取得しており、PHP経由で保存しようとしているデータURIを持っています。私は明らかに破損した画像ファイルを与える次のコードを使用します:PHPデータ-DWファイル

$data = $_POST['logoImage']; 

    $uri = substr($data,strpos($data,",")+1); 

    file_put_contents($_POST['logoFilename'], base64_decode($uri)); 



data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs 9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxklEQVQYlYWQMW7CUBBE33yITYUUmwbOkBtEcgUlTa7COXIVV5RUkXKC5AxU EdyZVD4kyKxkwIrr9vd0c7Oih aopinLNsF6Qkg2XW4XJ7LGFsAAcTV6lF5/jLdbALA9XDAXYfthFQVx OrmqKYK88/7rbbMFksALieTnzu9wDYTj6f70PKsp2kwAiSvjXNcvkWpAfNZkzWa/5a9yT7fdoX7rrB7hYh2fXo9HdjPYQZu3MIU8bYIlW20y0RUlXG2Kpv/vfwLxhTaSQwWqwhAAAAAElFTkSuQmCC 

以下は、実際の画像はデータURIです。 'logoImage'は上記の文字列、$ uriは文字列マイナス 'image/jpeg; base64'です。

+0

すみません、私はどこかでタイプミスをするのですか? – GAgnew

+0

例のデータURIが有効なPNG画像ではありません。これはうまく動作せず、コードとは無関係です。データに関連しています。 – hakre

+0

これをbase64イメージとして保存することができます。私はバイナリの専門家ではないので、ここで与えられたすべての例は32ビットの結果をもたらすと推測しています。 PHP 5.2では、データURLが機能するはずですので、ソリューションは実際には以下のように簡単になります: 'file_put_contents( 'logo.png'、preg_replace(/ \ s + /、 '+'、$ _POST ['logoImage']))' AJAXと組み合わせてJavaScriptのFileReader APIを使用している場合は、 – PHPglue

答えて

61

簡単に見at the PHP manualには、次のものが得られます。

あなたはJavascriptを canvas.toDataURL()関数から導出されたデータを保存する場合は、あなたがplussesに空白を変換する必要があります。 あなたが復号されたデータが破損している、ことを実行しない場合は、次の

<?php 
    $encodedData = str_replace(' ','+',$encodedData); 
    $decodedData = base64_decode($encodedData); 
?> 
+0

これは機能しました。うわー、私はこれを以前に見つけることができなかったとは思えません!できるだけ早くこれを受け入れるよ、ありがとう@Graydot – GAgnew

40

お客様のご使用のデータURIは有効なPNG画像ではありません。これはうまく動作せず、コードとは無関係です。データに関連しています。


は適用されませんが、参考になります。

file_put_contents($_POST['logoFilename'], file_get_contents($data)); 

アイデアの背後にある:PHP自体はあなたが自分でそれをデコードする必要はありませんdata URIs (data://)の内容を読み取ることができます。

公式データURIスキーム(ref:The "data" URL scheme RFC 2397)にはコロン( ":")の後に二重スラッシュ( "//")は含まれません。 PHPは2つのスラッシュの有無をサポートしています。

# RFC 2397 conform 
$binary = file_get_contents($uri); 

# with two slashes 
$uriPhp = 'data://' . substr($uri, 5); 
$binary = file_get_contents($uriPhp); 
+2

最後に 'file_put_contents($ _ POST ['logoFilename']、$ binary);' – andreszs

+0

PHP 5.5.25を使用していますので、二重スラッシュを追加する必要はありません。 – Andz

+1

@Andz:PHP 5.2+のように見えます。これはいつも働いていました:http://3v4l.org/Fk4RY - 非常に良いPHP.netに対するコメントも年を重ねています。地図を信頼してはいけません。地形を信頼してください。ヒントについてもう一度感謝してください。答えを訂正しました。 – hakre

19

働くすべてのコード:

$imgData = str_replace(' ','+',$_POST['image']); 
$imgData = substr($imgData,strpos($imgData,",")+1); 
$imgData = base64_decode($imgData); 
// Path where the image is going to be saved 
$filePath = $_SERVER['DOCUMENT_ROOT']. '/ima/temp2.png'; 
// Write $imgData into the image file 
$file = fopen($filePath, 'w'); 
fwrite($file, $imgData); 
fclose($file); 
+0

!!私はSOや他の場所でたくさんの答えを試しましたが、これがうまくいったのです!出来た!ありがとう。 – Jake

関連する問題