我遇到了一些PHP代码的问题,我认为我知道这个问题,但它对我来说似乎仍然很古怪。基本上,我的最终目标是将大量图像写入base64。
以下是相关full file的链接。最底层的函数(base64_encode_image)是我写的新函数。 obcallbackreplace()具有查找和替换字符串[themedir]等的代码。它几乎就像它不知道该做什么并且没有给出任何响应。我觉得我在某处遇到了逻辑错误,但却无法看到它。
转换为base64图像的功能:
function base64_encode_image($imageurl, $filetype, $curlopt=array()) {
isset($response) ? $response = '' : $response = '';
$ch = curl_init();
$default_curlopt = array(
CURLOPT_TIMEOUT => 2,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_USERAGENT => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.13) Gecko/20101203 AlexaToolbar/alxf-1.54 Firefox/3.6.13 GTB7.1"
);
$curlopt = array(CURLOPT_URL => $imageurl) + $curlopt + $default_curlopt;
curl_setopt_array($ch, $curlopt);
$image = curl_exec($ch);
if($response === false){
trigger_error(curl_error($ch));
}
curl_close($ch);
$base64 = 'data:image/png;base64,' . base64_encode($image);
return $base64;
}
字符串查找和替换URL的缩写函数:
function obcallbackreplace($buffer) {
global $cfg;
$themename = get_site_config("name=theme");
$themedir = $cfg["baseurl"]."plugins/site/themes/".$themename."/";
$buffer = str_replace('[themedir]', $themedir, $buffer);
return $buffer;
}
我应该能够这样做,它应该有用......但它没有。
<img src="<?php echo base64_encode_image('[themedir]images/logo.png','png')" />
测试1:
<img src="<?php echo base64_encode_image('[themedir]images/logo.png','png');?>" />
输出是(注意缺少的$ image参数):
<img src="data:image/png;base64," />
测试2:(注意:这是非公共服务器)
<img src="<?php echo base64_encode_image('http://sageth-dev/plugins/site/themes/premium/images/logo.png','png');?>" />
输出是:...(超长base64字符串,完全按照我的意愿执行。)
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZA />
测试3: 如果我将base64函数更改为:
return 'data:image/png;base64,' . base64_encode($image);
输出是(注意$ image未通过):
<img src="data:image/png;base64,"/>
测试4: 最后,如果我将其用作函数(改编自here):
$base64 = 'data:image/png;base64,' . base64_encode($image);
$base64 = urlencode($base64);
$base64 = htmlspecialchars($base64);
return $base64;
我明白了:
<img src="data%3Aimage%2Fpng%3Bbase64%2C" />
答案 0 :(得分:0)
所以问题是obcallbackreplace()在base64_encode_image()之后运行,所以你不处理参数$ imageurl。行“$ curlopt = array(CURLOPT_URL =&gt; $ imageurl)...”运行上面的测试1中的网址“[themedir] images / logo.png”,这是无效的网址。
在将$ imageurl变量添加到Curl选项之前,需要解析“[themedir]”。这样的事情应该有效:
$default_curlopt = array(...);
global $cfg;
$themename = get_site_config("name=theme");
$themedir = $cfg["baseurl"]."plugins/site/themes/".$themename."/";
$imageurl = str_replace('[themedir]', $themedir, $imageurl);
$curlopt = array(CURLOPT_URL => $imageurl) + $curlopt + $default_curlopt;