Преобразование изображения base64 с str_replace URL-адреса

Я сталкиваюсь с проблемой с некоторым PHP-кодом, где, как мне кажется, я знаю проблему, но мне все же кажется странным. В принципе, моя конечная цель - записать несколько изображений на base64.

Вот ссылка на полный файл. Самая нижняя функция (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;
}

Я должен уметь просто делать это, и он должен работать... но это не так.

Тест 1:

Выход (обратите внимание на отсутствующий параметр $ image):

Тест 2: (примечание: это непубличный сервер)

Вывод:... (супер длинная base64 строка, которая делает именно то, что я хочу, чтобы она сделала).

Тест 4: Последнее, если я использую это как функцию (адаптированную здесь):

$base64 = 'data:image/png;base64,' . base64_encode($image);
$base64 = urlencode($base64);
$base64 = htmlspecialchars($base64);
return $base64;

Я получил:

1 ответ

Поэтому проблема заключается в том, что obcallbackreplace() запускается после того, как base64_encode_image() делает, поэтому вы не обрабатываете параметр $ imageurl. Строка "$ curlopt = array (CURLOPT_URL => $ imageurl)..." запускается с URL-адресом "[themedir] images/logo.png" из вашего теста 1 выше, что является недопустимым URL-адресом.

Вам необходимо проанализировать "[themedir]" перед добавлением переменной $ imageurl в параметры Curl. Что-то вроде этого должно работать:

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

licensed under cc by-sa 3.0 with attribution.