【问题标题】:Use AJAX to display php generated image使用AJAX显示php生成的图片
【发布时间】:2012-04-04 07:28:05
【问题描述】:

我有一个随机生成图像的 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 + '">')
            }
        })
    })
})

我用firebug,可以看到实际发送了请求,也成功收到了响应,但是图片没有变化。

我做错了什么,我该如何解决?

【问题讨论】:

  • 尝试使用过期的浏览器缓存
  • @ShaktiSingh 感谢您的回复。我过期了,没有成功。
  • 您必须使用 Data URI scheme 中返回的数据来执行此操作。你的 PHP 看起来不像你在做这个。

标签: php jquery ajax


【解决方案1】:

我添加了另一个答案,因为我认为以前的答案都没有解决问题。我认为,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()));
});

【讨论】:

    【解决方案2】:

    图像标签的src 属性实际上需要一个 URL,而不是实际的 JPEG 数据。

    试试这个:

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

    【讨论】:

    • 感谢您的回复。这似乎对我不起作用。
    • @AnPel 我修正了我的答案。浏览器可能认为它不需要再次加载图像,因为 URL 没有改变。
    • 你是怎么修好的?图像仍将从缓存中获取。编辑:你现在修好了:-)
    • @devnull69 通过向请求添加随机 GET 参数。如果你能在其中添加 Unix-time,那就更好了......
    【解决方案3】:

    要使用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

    【讨论】:

    • 我不认为这实际上是这样工作的,因为 imagejpeg() 在没有位置的情况下仅返回真假值,因此根据文档它不会返回字符串。除非将图像存储在文件系统中,否则必须将其写入输出缓冲区并从缓冲区读取。
    【解决方案4】:

    生成的图像必须经过 base64 编码才能像这样包含在内。

    所以你需要做以下事情:

    • 编辑图片
    • 在数据字符串中获取结果图像。
    • 要获取图像字符串,您可以将其存储到文件系统并通过 file_get_contents() 读取它(对缓存有用),或者使用不带位置的 imagejpeg() 将图像放置在输出缓冲区中。要从输出缓冲区获取值,请使用 ob_start() 和 ob_get_contents()。
    • 将图像的数据字符串转换为base64(使用base64_encode())
    • 将此字符串返回给浏​​览器
    • 将图像“src”字段设置为“data:image/png;base64,[BASE64]”,其中 [BASE64] 是 PHP 返回的字符串。

    【讨论】:

    • 你的意思是我将 [BASE64] 替换为 ajax 字符串响应?
    • 两者都是有效选项。您可以按照 hakre 发布的方式回显所有内容,以便 PHP 返回所有内容 (data:image/png;base64,[BASE64]) 并将其放置为 src="",或者您可以在 JavaScript 本身中构建该字符串。这取决于您需要什么(最好不要让 PHP 回显“data:image/png;base64”部分,以防图片生成也用于其他地方。
    【解决方案5】:

    您正在调用的图像正在被浏览器缓存,请在您的图像 url 末尾使用查询字符串让浏览器将其视为新图像,并且不应使用缓存版本。

    类似这样的:

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

    【讨论】:

    • 这行不通。 PHP 文件发送原始图像数据而不是图像 URL
    【解决方案6】:

    试试$('#image').attr('src', data);,而不是$('#image').html('&lt;img src="' + data + '"&gt;')

    【讨论】:

    • 这行不通,PHP 文件发送的是原始图像数据而不是 URL
    • 是的,在这个问题中,他使用数据作为字符串,所以我不得不假设它实际上是一个字符串。考虑改为对问题投反对票。
    • 我明白你的意思,但我不会否决这个问题。因为如果 OP 知道这一点,他一开始就不会问 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2011-03-26
    • 2018-06-03
    相关资源
    最近更新 更多