31

是否可以在 HTML 的主流中显示由 jQuery AJAX 调用返回的图像?

我有一个脚本可以绘制带有标题的图像(图像/PNG)。当我在浏览器中简单地调用它时,就会显示图像。

但是当我在这个脚本上使用 jQuery 进行 AJAX 调用时,我无法显示干净的图像,我有很多奇怪的符号。这是我的脚本,它使图像带有标题(图像/PNG)。

#!/usr/bin/perl 

use strict;
use CGI;
use Template;
use CGI::Carp qw(fatalsToBrowser);
use lib qw(lib);
use GD;

my $cgi    = new CGI;

my $id_projet            =  $cgi   -> param('id_projet') ;      # 

# Create a new image
my $image = new GD::Image(985,60) || die;
my $red =  $image->colorAllocate(255, 0, 0);
my $black =  $image->colorAllocate(0, 0, 0);

$image->rectangle(0,0,984,59,$black);
$image->string(gdSmallFont,2,10,"Hello $id_projet ",$black);
# Output the image to the browser

print $cgi -> header({-type => 'image/png',-expires => '1d'});

#binmode STDOUT;

print $image->png;

然后我的主脚本里面有一个 AJAX 调用:

  <script type="text/javascript" > 

  $(document).ready( function() { 

  $.ajax({
  type: "POST",
  url:'get_image_probes_via_ajax.pl',
  contentType: "image/png",
  data: "id_projet=[% visual.projet.id %]",
  success: function(data){
  $('.div_imagetranscrits').html('<img src="' + data + '" />'); },
 } );

 </script>  

在我的 HTML 文件中,我有一个class="div_imagetranscrits"要填充我的图像的 div。

我看不出我做错了什么。另一种解决方案是让我的脚本将图像写入磁盘并获取包含在 src 中的路径以显示它。但我认为可以直接从 AJAX 请求中获取带有图像/PNG 标头的图像。

4

4 回答 4

43

您需要将图像发送回 base64 编码,看看这个: http: //php.net/manual/en/function.base64-encode.php

然后在您的 ajax 调用中将成功函数更改为:

$('.div_imagetranscrits').html('<img src="data:image/png;base64,' + data + '" />');
于 2012-05-29T15:48:49.373 回答
21

方法一

您不应该进行ajax调用,只需将img元素的src作为图像的url即可。

如果您使用 GET 而不是 POST,这将很有用

<script type="text/javascript" > 

  $(document).ready( function() { 
      $('.div_imagetranscrits').html('<img src="get_image_probes_via_ajax.pl?id_project=xxx" />')
  } );

</script>

方法二

如果您想发布到该图像并按照您的方式进行操作(尝试在客户端解析图像的内容,您可以尝试以下操作:http ://en.wikipedia.org/wiki/Data_URI_scheme

您需要将其编码data为 base64,然后您可以放入data:[<MIME-type>][;charset=<encoding>][;base64],<data>img src

例如:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot img" />

要编码为 base64:

于 2012-05-29T15:41:31.127 回答
8

这允许您只获取图像数据并设置为 img src,这很酷。

var oReq = new XMLHttpRequest();
oReq.open("post", '/somelocation/getmypic', true );        
oReq.responseType = "blob";
oReq.onload = function ( oEvent )
{
    var blob = oReq.response;
    var imgSrc = URL.createObjectURL( blob );                        
    var $img = $( '<img/>', {                
        "alt": "test image",
        "src": imgSrc
    } ).appendTo( $( '#bb_theImageContainer' ) );
    window.URL.revokeObjectURL( imgSrc );
};
oReq.send( null );

基本思想是数据未经篡改地返回,它被放置在一个blob中,然后在内存中为该对象创建一个url。见这里这里。注意支持的浏览器。

于 2013-10-30T11:40:37.587 回答
0

感谢上面的答案,经过更多的搜索,能够为 Spring Boot 应用程序提供以下解决方案。

HTML

<div class="row">
     <div class="col-11" id='img_div'>
     </div>
</div>

Javascript

function loadImage() {

        $.ajax({
            type: "GET",
            url: contextPath+"/loadImage",
            data: null,
            dataType: 'text',
            cache: false,
            timeout: 600000,
            success: function (data) {
                $('#img_div').html('<img id="img" src="data:image/png;base64,' + data + '" />');
                
            },
            error: function (e) {
                //handle error
            }
        });
    
    }

控制器方法

@GetMapping("/loadImage")
@ResponseBody
private String loadImagefromExternalFolder(HttpServletRequest request){     
    String encodedString = "";
    
    try {       
        RandomAccessFile f =  new RandomAccessFile("C:\\your_folder_path\\your_img.PNG", "r");
        byte[] b = new byte[(int)f.length()];
        f.readFully(b);
        
        encodedString = Base64.getEncoder().encodeToString(b);

    }catch (Exception e) {
        // handle error
    }


    return encodedString;
    
}
于 2021-07-08T10:55:27.537 回答