読者です 読者をやめる 読者になる 読者になる

俺が生きている可能性は高い

人生ガンバローン

DataURLから画像へ変換するときはヘッダに気をつけてください的な話

Webブラウザで撮影した写真をサーバにアップロードしたいときってありますよね。

そういうときは大体video要素とかcanvas要素とかをガリガリ使って静止画にして canvas.toDataUrl() ったものをajaxAPIへ送信すると思います。

サーバサイドでは、送信されてきたbase64encodedな画像をdecodeして煮るなり焼くなりすれば良いのですが、実際にはちょっと注意が必要です。

canvas.toDataUrl() の返り値

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAADElEQVQImWNgoBMAAABpAAFEI8ARAAAAAElFTkSuQmCC

ご覧の通り、純粋なbase64文字列ではなく、

  1. データURIスキームであること
  2. 画像の種類
  3. base64エンコードされていること

を示すヘッダがついてます。

この部分ですね

data:image/png;base64,

なので、 ボケーっと

$photo = base64decode($request->input('photo');

とかやると、壊れた画像が出来上がっちゃいます。

ちゃんとヘッダ部分を取り除いてからbase64decodeしましょう。

$offset = strpos($req->input('photo'), 'base64') + 7;
$base64encoded = substr($req->input('photo'), $offset);
$photo = base64_decode($base64encoded);

参考文献

  1. https://developer.mozilla.org/ja/docs/Web/API/HTMLCanvasElement/toDataURL

PHP 7.0.3 をインストールするためにconfigureオプションについて調べた

2016年2月4日に PHP 7.0.3 がリリースされましたね。

PHP: News Archive - 2016

よく訓練されたPHPerな僕は最新版をビルドしようと ./configure すると色々怒られた(多分7.0.2のビルドのときにもコケてたはずだけど気づかなかった)ので、改めて標準的な構成でPHPをビルドするためのオプションを調べたので備忘録代わりにメモっときます。

./configure \
--prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--without-pear \
--enable-sockets \
--enable-zip \
--with-openssl \
--enable-cgi \
--enable-pdo \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-embedded-mysqli \
--with-pdo-sqlite \
--with-readline \
--enable-mbstring \
--disable-debug \
--enable-fpm \
--enable-opcache

上でconfigureすれば、

  • pearは使わない

  • pdo(mysql)が使える

  • php-fpmが使える

  • opcacheが使える

  • 日本語が使える

  • インタラクティブシェルが使える (--with-readline をつけないと php -a ってやってもインタラクティブモードになってプログラムの実行に Ctrl + D のタイプが必要になる)

という感じです。

これは今日まで知らなかったのですが、PHPでプロセス管理したい!っていう特殊なニーズをお持ちの方向けに --enable-pcntl でフォーク出来るようになるっぽいです。

PHP: PCNTL - Manual

PHPでもforkがしたい! | ADN LAB's Blog

自分でビルドしたい人の参考になると嬉しいです。