Мне нужно отправить закодированную строку base64
клиенту. Поэтому я открываю и читаю файл изображения на сервере, кодирую его и отправляю в браузер эти данные вместе с типом контента image/jpeg
. Пример в PHP:Отправка/отображение кодированного base64 изображения
$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
элемента <img>
показывает изображение, как ожидалось.
Что я здесь делаю неправильно?
Решение
Благодаря Pekka
указал мне на мою ошибку. Вам не нужно (вы не можете!) Кодировать данные двоичного изображения как base64 в этом подходе. Без кодировки base64 это просто работает.
Похоже, вы должны быть установочное значение в 'src' атрибута к тексту ответа непосредственно (то есть' img.src = "data: image/jpeg; base64, ..." '... и правая часть здесь может быть возвратным значением из вызова Ajax) - в противном случае браузер попытается запросить изображение из URL-адреса, re, что не будет работать, потому что оно напрямую возвращает «data: image ...» вместо байтов изображения. –
Что вы хотите сделать? – Hello71
Мне не нужны накладные расходы на вызов ajax. Мне это нужно как можно быстрее. Чтобы получить некоторый ответ «ответ», мне нужно иметь правильное изображение, чтобы проверить, например, ширину. – jAndy