【问题标题】:base64 image conversion with str_replace of URL使用 URL 的 str_replace 进行 base64 图像转换
【发布时间】:2014-08-14 22:11:53
【问题描述】:

我在一些 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" />

【问题讨论】:

    标签: php image base64


    【解决方案1】:

    所以问题是 obcallbackreplace() 在 base64_encode_image() 之后运行,所以你没有处理参数 $imageurl。 "$curlopt = array(CURLOPT_URL => $imageurl)..." 行使用上面测试 1 中的 url "[themedir]images/logo.png" 运行,这不是有效的 url。

    在将 $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;
    

    【讨论】:

    • 这是有道理的。如果我添加了 URL 编码,我可以看到 [themedir] 被拾取而不是 URL,但是 - 由于某种原因 - 我完全错过了在 base64 函数之后调用 obcallbackreplace 。谢谢!
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2020-01-10
    • 2019-07-12
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多