我的PHP Web应用程序有一个API,可以接收base64编码的合理大文件(最大32 MB).目标是在我的文件系统上的某处写入这些文件.当然是解码的.这样做资源最少的方法是什么?
编辑:通过API接收文件意味着我的PHP应用程序中有32MB字符串,而不是磁盘上某处的32 MB源文件.我需要将该字符串解码为文件系统.
使用PHP自己的base64_decode()并没有削减它,因为它使用了大量的内存,所以我一直在运行PHP的内存限制(我知道,我可以提高这个限制,但我不觉得允许PHP使用256MB左右每个过程).
还有其他选择吗?我可以手动完成吗?或者将文件写入磁盘编码并调用一些外部命令?任何想法?
Eve*_*ert 20
即使这有一个公认的答案,我也有不同的建议.
如果要从API中提取数据,则不应将整个有效内容存储在变量中.使用curl或其他HTTP提取程序,您可以自动将数据存储在文件中.
假设您通过简单的GET URL获取数据:
$url = 'http://www.example.com/myfile.base64';
$target = 'localfile.data';
$rhandle = fopen($url,'r');
stream_filter_append($rhandle, 'convert.base64-decode');
$whandle = fopen($target,'w');
stream_copy_to_stream($rhandle,$whandle);
fclose($rhandle);
fclose($whandle);
Run Code Online (Sandbox Code Playgroud)
优点:
如果你必须从临时变量中获取数据,我可以建议这种方法:
$data = 'your base64 data';
$target = 'localfile.data';
$whandle = fopen($target,'w');
stream_filter_append($whandle, 'convert.base64-decode',STREAM_FILTER_WRITE);
fwrite($whandle,$data);
fclose($whandle);
Run Code Online (Sandbox Code Playgroud)
Gum*_*mbo 11
以较小的块解码数据.Base64数据的四个字符等于"Base256"数据的三个字节.
因此,您可以将每个1024个字符分组并将其解码为768个八位字节的二进制数据:
$chunkSize = 1024;
$src = fopen('base64.data', 'rb');
$dst = fopen('binary.data', 'wb');
while (!feof($src)) {
fwrite($dst, base64_decode(fread($src, $chunkSize)));
}
fclose($dst);
fclose($src);
Run Code Online (Sandbox Code Playgroud)