我有一大串base64图像数据(大约200K)。当我尝试通过使用正确的头输出解码数据来转换该数据时,脚本就会死掉,好像没有足够的内存。我的Apache日志中没有错误。我下面的示例代码适用于小图像。如何解码大图?
<?php
// function to display the image
function display_img($imgcode,$type) {
header('Content-type: image/'.$type);
header('Content-length: '.strlen($imgcode));
echo base64_decode($imgcode);
}
$imgcode = file_get_contents("image.txt");
// show the image directly
display_img($imgcode,'jpg');
?>
答案 0 :(得分:2)
由于base64 - 编码数据每4个字节干净地分开(即3个字节的明文被编码为4个字节的base64编码文本),您可以将b64字符串拆分为4个字节的倍数,并处理他们分开:
while (not at end of string) {
take next 4096 bytes // for example - 4096 is 2^12, therefore a multiple of 4
// you could use much larger blocks, depends on your memory limits
base64-decode them
append the decoded result to a file, or a string, or send it to the output
}
如果你有一个有效的base64字符串,这将同样解决所有这一切。
答案 1 :(得分:1)
好的,这是一个更接近的解决方案。虽然这似乎以较小的块解码base64数据,但我仍然没有在浏览器中获取图像。如果我在放置标题之前回显数据,我会得到输出。同样,这适用于小图像但不是大图像。想法?
<?php
// function to display the image
function display_img($file,$type) {
$src = fopen($file, 'r');
$data = "";
while(!feof($src)) {
$data .= base64_decode(fread($src, 4096));
}
$length = strlen($data);
header('Content-type: image/'.$type);
header('Content-length: '.$length);
echo $data;
}
// show the image directly
display_img('image.txt','jpg');
?>
答案 2 :(得分:0)
Content-length必须指定实际(已解码)内容长度,而不是base64编码数据的长度。
虽然我不确定修复它会解决这个问题......
答案 3 :(得分:-1)
使用imagejpeg()
将base64字符串保存到图像文件或使用不同格式的正确函数,然后使用简单的<img>
标记显示图像。