@traylz は、失敗すべきではないのに失敗する理由を明確にしています。ただし、base64_decode()
大きな画像でも失敗する場合があります。私は 6 ~ 7 MB のファイルを問題なく扱ってきましたが、このサイズを超えていないので、次のように単純なはずです。
$dir = dirname(__FILE__);
// get the base64 encoded file and decode it
$o_en = file_get_contents($dir . '/base64.txt');
$d = base64_decode($o_en);
// put decoded string into tmp file
file_put_contents($dir . '/base64_d', $d);
// get mime type (note: mime_content_type() is deprecated in favour
// for fileinfo functions)
$mime = str_replace('image/', '.', mime_content_type($dir . '/base64_d'));
rename($dir . '/base64_d', $dir . '/base64_d' . $mime);
chunk_split()
以下が失敗した場合は、関数をデコード操作に追加してみてください。
$d = base64_decode(chunk_split($o_en));
だから私は何を言っているのですか...必要がない限りループを忘れてください...phpのmime検出を信頼しない場合は、元のファイル拡張子を保持してください。大きなファイルで作業する場合は、操作で使用chunk_split()
します。base64_decode()
注:すべての理論はテストされていません
編集:ほとんどの場合フリーズする可能性が高い大きなファイルのfile_get_contents()
場合、必要なものを読み取り、ファイルに出力するため、RAM はほとんど使用されません:
$chunkSize = 1024;
$src = fopen('base64.txt', 'rb');
$dst = fopen('binary.mime', 'wb');
while (!feof($src)) {
fwrite($dst, base64_decode(fread($src, $chunkSize)));
}