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

Мне нужно отправить строку с кодировкой 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); 

Clientside , я звоню:

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

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

Если я отправлю эти данные в виде Content-type: text/plain он работает, строка base64 отображается в браузере (если я вызываю скрипт напрямую). Копирование и вставка этого вывода в src элемента <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).'">'; 

и тебе хорошо идти.

Я считаю, что это можно сделать достаточно эффективно, просто используя php только … вы можете использовать приведенную ниже функцию для рендеринга изображений в кодированных base64 данных

  function binaryImages($imgSrc,$width = null,$height = null){ $img_src = $imgSrc; $imgbinary = fread(fopen($img_src, "r"), filesize($img_src)); $img_str = base64_encode($imgbinary); if(isset($height) && isset($width)) { echo '<img src="data:image/jpg;base64,'.$img_str.'" height="'.$height.'" width="'.$width.'"/>'; } else { echo '<img src="data:image/jpg;base64,'.$img_str.'"/>'; } } 

как использовать эту функцию

  binaryImages("../images/end.jpg",100,100); 

выполните функцию binaryImages .. 1-й параметр – путь изображения, второй – ширина, а затем высота … высота и ширина необязательны

я бы рекомендовал его: base64_encode Кодирует данные с MIME base64

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