2010-07-15 3 views
14

Мне нужно отправить закодированную строку 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 это просто работает.

+0

Похоже, вы должны быть установочное значение в 'src' атрибута к тексту ответа непосредственно (то есть' img.src = "data: image/jpeg; base64, ..." '... и правая часть здесь может быть возвратным значением из вызова Ajax) - в противном случае браузер попытается запросить изображение из URL-адреса, re, что не будет работать, потому что оно напрямую возвращает «data: image ...» вместо байтов изображения. –

+0

Что вы хотите сделать? – Hello71

+0

Мне не нужны накладные расходы на вызов ajax. Мне это нужно как можно быстрее. Чтобы получить некоторый ответ «ответ», мне нужно иметь правильное изображение, чтобы проверить, например, ширину. – jAndy

ответ

3

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

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

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

+0

@Pekka: Я пишу маяк. Мне нужно какое-то ответное сообщение клиенту, я ищу проверку ширины изображения для получения разных типов ответов. Я делаю это, потому что я не хочу ** накладных расходов на «ajax call». – jAndy

+0

@jAndy, который должен работать нормально с нормальным свойством 'src', не нужно base64 кодировать все, что я думаю. ** Повторите свое обновление: ** вы также можете определить ширину изображения на стороне сервера и отправить его как целое (вместо всего изображения). Однако вам нужно сделать правильный вызов Ajax. –

+0

@Pekka: Боюсь, я тебя не понимаю? Как отправить изображение через файл сценария сервера на клиент, не кодируя его с помощью bas64? – jAndy

13

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

Вы эффективно создаете данные uri, что хорошо, но, как вы отметили, только как uri. Поэтому оставьте тип контента таким, как он есть (текст/html), и

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

и вы в порядке.

5

Я считаю, что это может быть сделано достаточно эффективно только с помощью только 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-й параметр - путь изображения, второй - ширина, а затем высота ...высота и ширина являются необязательными

+0

это хороший подход, если некоторые 1 хотят изображения с разными разрешениями. Это также спрячет URL-адрес изображения? если это так, то также лучше, если кто-то 1 хочет скрыть URL-адрес изображения –

0

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

echo '<img src="data:image/jpeg;base64,'.base64_encode($image).'">'; 
Смежные вопросы