Отправка/Отображение base64 закодированного Изображения

Я должен отправить a base64 закодированная строка клиенту. Поэтому я открываю и читаю файл изображения на сервере, кодирую его и отправляю те данные наряду с image/jpeg тип контента к браузеру. Пример в php:

$image      = $imagedir . 'example.jpg';
$image_file = fopen($image, 'r');
$image_data = fread($image_file, filesize($image));

header("Content-type: image/jpeg");
echo 'data:image/jpeg;base64,' . base64_encode($image_data);

Сторона клиента, я звоню:

var img     = new Image();
img.src     = "http://www.myserver.com/generate.php";
img.onerror = function(){alert('error');}
$(img).appendTo(document.body);

Это не работает по некоторым причинам. onerror всегда огни. Наблюдение FireBug Network task например, говорит мне, что я получаю корректную информацию заголовка и правильное значение переданных байтов.

Если я отправляю те данные как Content-type: text/plain это работает, base64 строку показывают в браузере (если я называю сценарий непосредственно). Копирование и вставка того вывода в src из a <img> элемент показывает изображение как ожидалось.

Что я делаю неправильно здесь?

Решение

Спасибо Pekka для указания на меня на моей ошибке. Вам не нужно (Вы не можете!) кодируют те данные двухуровневого изображения base64 строка в таком подходе. Без кодирования base64 это просто работает.

18
задан jAndy 15 July 2010 в 21:16
поделиться

2 ответа

В этом случае нет причин для кодирования данных изображения в кодировке base64 в первую очередь. То, что вы хотите испустить, - это простые старые данные изображения.

Просто пропустите изображение JPEG как есть.

Единственный способ, которым это будет иметь для меня смысл, - это если вы получите вывод generate.php через вызов AJAX и поместите результат напрямую в свойство src . Это должно сработать (хотя и не в IE <8, но я уверен, что вы это знаете). Но если вы можете вызвать generate.php непосредственно в качестве источника изображения, я не вижу в этом необходимости.

4
ответ дан 30 November 2019 в 08:43
поделиться

Если вы установили тип содержимого как image / jpeg, вы должны предоставить только данные jpeg, без всякой ерунды base64. Но вы относитесь к результату как к HTML.

Фактически вы создаете uri данных, что нормально, но, как вы заметили, только как uri. Так что оставьте тип содержимого как есть (text / html) и

echo '<img src="data:image/jpeg;base64,'.base64_encode($image_data).'">';

, и все готово.

14
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: