>我有一个系统,在从电子邮件文件中剥离文件后,将文件以Base 64编码保存到服务器硬盘驱动器。
我想再次将文件更改为原始格式,如何在 PHP 中执行此操作?
这就是我尝试保存文件的方式,但这似乎没有创建有效的文件:
$start = $part['starting-pos-body'];
$end = $part['ending-pos-body'];
$len = $end-$start;
$written = 0;
$write = 2028;
$body = '';
while ($start <= $end) {
fseek($this->stream, $start, SEEK_SET);
$my = fread($this->stream, $write);
fwrite($temp_fp, base64_decode($my));
$start += $write;
}
fclose($temp_fp);
>@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 检测,请保留原始文件扩展名。如果处理大文件,请在base64_decode()
操作上使用chunk_split()
。
注意:所有理论都未经测试
编辑:对于很可能冻结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)));
}
你的问题是你读取了 2028 个块,在你读取块后检查 start<=end U,所以你读取了 end 指针之外,你应该检查 <= 的 insead <(以避免读取 0 字节)
此外,您不需要在每次迭代时都搜索,因为 fread 会从当前位置读取。你可以把 fssek 从循环中取出(在 while 之前)。顺便说一句,为什么是 2028 年?试试这个:
fseek($this->stream, $start, SEEK_SET);
while ($start < $end) {
$write = min($end-$start,2048);
$my = fread($this->stream, $write);
fwrite($temp_fp, base64_decode($my));
$start += $write;
}
fclose($temp_fp);
谢谢大家的帮助最后我得到:
shell_exec('/usr/bin/base64 -d '.$temp_file.' > '.$temp_file.'_s');