2012-04-04 75 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

嘗試到期瀏覽器緩存 – 2012-04-04 07:30:13

+0

@ShaktiSingh謝謝您的答覆。我過期了,沒有成功。 – ppp 2012-04-04 07:31:49

+0

您必須使用** [數據URI方案](http://en.wikipedia.org/wiki/Data_URI_scheme)**中返回的數據來執行此操作。你的PHP看起來並不像你這樣做。 – m90 2012-04-04 07:35:21

回答

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 2012-04-04 07:52:14

+0

好秀(Y)!! – mim 2012-04-04 07:56:13

+0

謝謝devnull69!你讓我今天一整天都感覺很好! – Luca 2014-09-01 07:49:01

4

圖像標籤的src屬性實際上期望URL不是實際的JPEG數據。

試試這個:

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

感謝您的回覆。這似乎不適用於我。 – ppp 2012-04-04 07:38:11

+0

@AnPel我修復了我的答案。瀏覽器可能認爲它不需要再次加載圖像,因爲URL沒有改變。 – 2012-04-04 07:50:22

+0

你修好了嗎?該圖像仍將從緩存中獲取。編輯:你現在修復它:-) – devnull69 2012-04-04 07:51:00

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 2012-04-04 07:40:24

+0

我不好,你說得對。修正了這個例子。 – hakre 2012-04-04 07:42:55

0

生成的圖像必須以base64編碼才能包含在內。

所以,你需要做到以下幾點:

  • 編輯圖像
  • 獲取導致數據串的圖像。
  • 要獲取圖像字符串,可以將其存儲到文件系統,並通過file_get_contents()(對緩存很有用)讀取它,或者使用不帶位置的imagejpeg(),將圖像放入輸出緩衝區。要從輸出緩衝區獲取值,請使用ob_start()和ob_get_contents()。圖像以BASE64的
  • 轉換數據串(使用BASE64_ENCODE())
  • 返回此字符串到瀏覽器
  • 集圖像 「SRC」 字段設置爲 「數據:圖像/ PNG; BASE64,[BASE64]」,其中[ BASE64]是從PHP返回的字符串。
+0

你的意思是我用ajax字符串響應替換[BASE64]? – ppp 2012-04-04 07:48:36

+0

這兩個都是有效的選項。你可以按照發布的方式迴應所有的東西,所以PHP返回所有東西(data:image/png; base64,[BASE64]),並且把它放在src =「」中,或者你可以用JavaScript本身構建這個字符串。這取決於你需要什麼(最好不要讓PHP回顯「data:image/png; base64」,以防在其他地方使用圖片生成功能 – kingmaple 2012-04-04 12:04:25

-1

您呼叫正在被瀏覽器緩存的圖像,使用查詢字符串的圖片網址的結尾讓瀏覽器的事情了一個新的形象,它不應該使用緩存的版本。

事情是這樣的:

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

這是行不通的。圖片數據而不是圖片網址 – devnull69 2012-04-04 07:49:45

-1

代替$('#image').html('<img src="' + data + '">'),嘗試$('#image').attr('src', data);

+0

這不行,PHP文件發送原始圖片數據而不是URL – devnull69 2012-04-04 07:50:17

+0

是的,在問題中,他使用數據作爲字符串,所以我不得不假定它是在事實上,一個字符串,考慮下調這個問題, – Tuan 2012-04-04 07:56:36

+0

我明白了你的觀點,但我不會低估這個問題,因爲如果OP知道這一點,他就不會首先提問:-) – devnull69 2012-04-04 07:58:36