Я должен отправить 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 это просто работает.
В этом случае нет причин для кодирования данных изображения в кодировке base64 в первую очередь. То, что вы хотите испустить, - это простые старые данные изображения.
Просто пропустите изображение JPEG как есть.
Единственный способ, которым это будет иметь для меня смысл, - это если вы получите вывод generate.php
через вызов AJAX и поместите результат напрямую в свойство src
. Это должно сработать (хотя и не в IE <8, но я уверен, что вы это знаете). Но если вы можете вызвать generate.php
непосредственно в качестве источника изображения, я не вижу в этом необходимости.
Если вы установили тип содержимого как image / jpeg, вы должны предоставить только данные jpeg, без всякой ерунды base64. Но вы относитесь к результату как к HTML.
Фактически вы создаете uri данных, что нормально, но, как вы заметили, только как uri. Так что оставьте тип содержимого как есть (text / html) и
echo '<img src="data:image/jpeg;base64,'.base64_encode($image_data).'">';
, и все готово.