フタなしカンヅメ

徒然なるままに @happytar0

PHPにPOSTでBase64の文字列を渡すときは注意

RubyのZlibで圧縮したデータをBase64にして、PHPのスクリプトにPOSTで渡すってことをやっていたのですが、圧縮データを展開できる時と、できない時があって悩んでしまった。

よくよく調べると、そもそもBase64をデコード出来ていなかった。それで調べてみると、PHPのドキュメントの下に書いてありました。
PHP: base64_decode - Manual
どうやら、POSTでデータを渡すと、Base64の「+」記号が勝手にスペースに変換されてしまうらしい。
以下のように修正したところ無事に動きました。

## str_replace でスペースを+に置換
$data = base64_decode(str_replace(' ', '+', $data));
## ヘッダ分を差し引いてあげないとだめなのね・・・
$_data = gzinflate(substr($data, 10, -8));

ちなみにRuby側です。
Zlib::MAX_WBITSに+16を足すと、前後に圧縮データ情報も付加されたGZIP形式になるそうです。

z = Zlib::Deflate.new Zlib::BEST_COMPRESSION, Zlib::MAX_WBITS + 16
param = [z.deflate(data, Zlib::FINISH)].pack('m')
z.close