2012-04-04 2 views
1

У меня есть скрипт php, который случайно генерирует изображение. Что-то вроде этого:Используйте AJAX для отображения генерируемого php изображения

<?php 
$image = imagecreatetruecolor(400,200); 

// process image 

// rendering image 
header("Content-type: image/jpeg"); 
imagejpeg($image); 
?> 

Мой HTML выглядит следующим образом:

<img id="image" src="/models/plugins/image.php"/> 
<button id="button">Get new image</button></body> 

Тогда у меня есть файл Jquery, который обрабатывает щелчок на кнопке, так что загружается новое случайное изображение, когда кнопка щелкнул:

$(function(){ 
    $('#button').click(function(){ 
     $.ajax({ 
      url: 'models/plugins/image.php', 
      success: function(data){ 
       $('#image').html('<img src="' + data + '">') 
      } 
     }) 
    }) 
}) 

Я использую поджигатель, я могу видеть, что запрос на самом деле послал и что ответ получен успешно, но изображение не меняется.

Что я делаю неправильно и как я могу это исправить?

+0

Попробуйте с истечением срока действия кэша браузера –

+0

@ShaktiSingh Благодарим за отзыв. Я просрочил его, никакого успеха. – ppp

+0

Для этого вам нужно будет использовать данные, возвращаемые в ** [Схема URI данных] (http://en.wikipedia.org/wiki/Data_URI_scheme) **. Ваш PHP не выглядит так, как вы это делаете. – m90

ответ

7

Я добавил еще один ответ, потому что я думаю, что ни один из предыдущих ответов не решить эту проблему. Я думаю, единственное, что хотел OP - это обновить (!) Изображение при нажатии кнопки. Таким образом, нет необходимости в запросе Ajax, просто перезагрузите изображение. И вы можете обеспечить это, добавив случайную строку запроса в атрибут src изображения.

$('#button').click(function() { 
    var $image = $('#image'); 
    var plainSrc = $image.attr('src').split("?")[0]; // disregard previous query string 
    $image.attr('src', plainSrc + "?" + (new Date().getTime())); 
}); 
+0

Вы побеждаете. Так оно и было. – ppp

+0

Хорошее шоу (Y) !! – mim

+0

спасибо devnull69! вы сделали мой день! – Luca

4

Атрибут тега изображения фактически ожидает, что URL-адрес не соответствует фактическим данным JPEG.

Попробуйте это:

$(function(){ 
     $('#button').click(function(){ 
      $('#image').attr('src', 'models/plugins/image.php?rand=' + Math.floor(Math.random()*1000)); 
     }); 
}); 
+0

Благодарим за отзыв. Кажется, это не работает для меня. – ppp

+0

@AnPel Я исправил свой ответ. Вероятно, браузер, возможно, не нуждался в загрузке изображения, так как URL-адрес не изменился. –

+0

Вы исправили это как? Изображение будет сохранено из кеша. EDIT: вы исправили его сейчас :-) – devnull69

1

Чтобы использовать изображение внутри src атрибута необходимо предоставить действительный URI, например data-URI:

<?php 
$image = imagecreatetruecolor(400,200); 

// process image 

// create image URI 
ob_start(); 
imagejpeg($image); 
echo "data:image/jpeg;base64,", base64_encode(ob_get_clean()); 
?> 

Я однажды скомпилирован a more detailed answer на подобный вопрос ,

+0

Я не думаю, что это действительно работает так, поскольку imagejpeg() возвращает только значение true-false при использовании без местоположения, оно не возвращает строку в соответствии с к документации. Он должен быть записан в буфер вывода и считываться из буфера, если не хранить изображение в файловой системе. – kingmaple

+0

Плохо, ты прав. Исправлен пример. – hakre

0

Результирующее изображение должно быть закодировано в base64, чтобы быть включенным таким образом.

Так что вам нужно сделать следующее:

  • Отредактируйте изображение
  • Get результирующее изображение в строке данных.
  • Чтобы получить строку изображения, вы либо храните ее в файловой системе, либо читаете ее через file_get_contents() (полезно для кеша) или используете imagejpeg() без местоположения, что помещает изображение в выходной буфер. Чтобы получить значение из выходного буфера, используйте ob_start() и ob_get_contents().
  • Преобразование строки данных изображения в base64 (с использованием base64_encode())
  • вернуть эту строку в браузере
  • поле
  • Набор изображений «SRC» на «данные: изображения/PNG; base64, [BASE64]», где [ BASE64] - это строка, возвращаемая с PHP.
+0

Вы имеете в виду, что я заменяю [BASE64] на ответ строки ajax? – ppp

+0

Оба варианта являются допустимыми. Вы можете либо откликнуться на все, как hakre, так что PHP возвращает все (данные: image/png; base64, [BASE64]), и вы поместите его как src = "", или вы можете построить эту строку в самом JavaScript. Это зависит от того, что вам нужно («лучше» не иметь PHP, чтобы эхо «data: image/png; base64», часть в случае, когда генерация изображения используется и в другом месте. – kingmaple

-1

Образ, который вы вызываете, кэшируется браузером, используйте строку запроса в конце URL-адреса вашего изображения, чтобы браузер использовал новое изображение и не должен использовать кешированную версию.

Что-то вроде этого:

$(function(){ 
    $('#button').click(function(){ 
     $.ajax({ 
      url: 'models/plugins/image.php?t='+((new Date).getTime()), 
      success: function(data){ 
       $('#image').html('<img src="' + data + '">') 
      } 
     }) 
    }) 
}) 
+0

Это не сработает. данные изображения, а не изображение URL – devnull69

-1

Вместо $('#image').html('<img src="' + data + '">'), попробуйте $('#image').attr('src', data);

+0

Это не сработает, файл PHP отправляет необработанные данные изображения, а не URL – devnull69

+0

Да, в этом вопросе он использовал данные как строку, поэтому я должен был предположить, что это было, в факту, строке. Вместо этого рассмотрим вопрос: – Tuan

+0

Я вижу вашу точку зрения, но я не буду обсуждать вопрос. Потому что, если бы ФП знал об этом, он бы не спросил в первую очередь :-) – devnull69