このコードは正常に動作します (ただし、大きな入力ファイルでは失敗するのではないかと懸念しています)。例 1 はファイル全体を読み取り、ループしません。例 2 は 3k チャンクを読み取り、EOF までループします。
$in = fopen("in.b64", 'r');
$out = fopen("out.png", 'wb');
if ((!$in) || (!$out)) die ("convert: i/o error in base64 convert");
$first = true;
while (!feof($in))
{
$b64 = fread($in,filesize($in_fn));
// strip content tag from start of stream
if ($first)
{
$b64 = substr($b64,strpos($b64,',')+1);
$first = false;
}
$bin = base64_decode($b64);
if (!fwrite($out,$bin)) die("convert write error in base64 convert");
}
fclose($in);
fclose($out);
このコードは破損した画像を生成しますが、次のようになります。
$in = fopen("in.b64", 'r');
$out = fopen("out.png", 'wb');
if ((!$in) || (!$out)) die ("convert: i/o error in base64 convert");
$first = true;
while (!feof($in))
{
$b64 = fread($in,3072);
// strip content tag from start of stream
if ($first)
{
$b64 = substr($b64,strpos($b64,',')+1);
$first = false;
}
$bin = base64_decode($b64);
if (!fwrite($out,$bin)) die("convert write error in base64 convert");
}
fclose($in);
fclose($out);