jpGraph - 如何通过POST调用发送图像

时间:2012-01-31 01:03:29

标签: php jquery

在客户端,有jQuery脚本向example.php发送POST请求。

$.post('example.php', function(data) {
    var $newImg = $('<img src="' + data + '"/>');
    $('#placeholder').html($newImg);
});

示例PHP应返回使用base64_encode编码的图像数据,但出现问题。这是example.php的一部分:

$contentType = 'image/png';
$gdImgHandler = $graph->Stroke(_IMG_HANDLER);
$image_data = $graph->img->Stream();

$str = "data:$contentType;base64," . base64_encode($image_data);
echo $str;
exit;

编辑:在客户端,而不是图片,有很多字符: enter image description here

我无法想象这里有什么问题。我已经通过POST发送图像数据,但与其他库一起发送。有人可以帮我这个吗?

EDIT2 看起来返回的图片数据有&gt;在它,所以它分为图像+自定义标签。看看这个: enter image description here EDIT3:我很抱歉,我弄错了。我正在研究图表库,我错了,因为我发布的标题与PHPlot有问题,实际上我有jpGraph图表库的问题。再次,抱歉。我仍然有解决方案但是对于jpGraph。

EDIT4:如果我在Orbit的代码中尝试Lightness Races:

$contentType = 'image/png';
$gdImgHandler = $graph->Stroke(_IMG_HANDLER);

ob_start();                        // start buffering
$graph->img->Stream();             // print data to buffer
$image_data = ob_get_contents();   // retrieve buffer contents
ob_end_clean();                    // stop buffer

echo "data:$contentType;base64;" . base64_encode($image_data);

我在浏览器中得到这个: enter image description here

在萤火虫中我看到了这个: enter image description here

4 个答案:

答案 0 :(得分:4)

在您的Javascript中

首先,您不是HTML转义data。显然,某些东西 - 可能是/字符,它是base-64系统中的索引63,正在关闭img标记,这就是为什么你会看到这么多数据溢出到周围文本中的原因。

使用一种不需要你的技术,不是自己编写HTML而是直接操作DOM:

$.post('example.php', function(data) {
    var $newImg = $('<img />');
    $newImg.attr('src', data);   // <----- just string, not HTML, input
    $('#placeholder').html($newImg);
});

在PHP中

此外,正如@Cheeky指出的那样,the manual's examples证明:

 $image_data = $graph->img->Stream();
 // ^                          ^
 // |                          + outputs image data
 // + nothing assigned

不需要使用Stroke;这将允许您写入文件或获取GD句柄,但由于GD和jpGraph都不允许您直接获取图像缓冲区,因此对您没用。

所以,你必须写一个解决方法。

你可以直接去:

<?php
$contentType = 'image/png';
$gdImgHandler = $graph->Stroke(_IMG_HANDLER);

echo "data:$contentType;base64,";  // print prefix
$graph->img->Stream();             // print data
?>

但问题是,您的数据不再是base-64编码的。 PHP的output buffering features将解决此问题:

<?php
$contentType = 'image/png';
$gdImgHandler = $graph->Stroke(_IMG_HANDLER);

ob_start();                        // start buffering
$graph->img->Stream();             // print data to buffer
$image_data = ob_get_contents();   // retrieve buffer contents
ob_end_clean();                    // stop buffer

echo "data:$contentType;base64," . base64_encode($image_data);
?>

有点冗长,但是jpGraph似乎没有内置的方法。

答案 1 :(得分:1)

看起来您忘记使用Base64对其进行编码。数据字符串具有不应该采用Base64编码的符号。而且,具体来说,它没有data和其他部分。你确定从正确的脚本中得到它吗? 或者Stream()函数将图像文件内容直接输出到标准输出,而不是$ image_data变量。

尝试使用http://phplot.sourceforge.net/phplotdocs/EncodeImage.html

$image_data = $graph->EncodeImage('base64');

之后您不需要base64_encode

ps:downvoter - 你在这里看不到明显的东西,想一想我在上面和评论中所写的内容。他的Stream()(或其他东西)将PNG文件的内容输出回浏览器! 这就是<img src='.PNG..显示PNG文件标题及其二进制内容的原因。

pps:如果你在谈论jGraph,那么你的代码应该是这样的(我没有在API中看到所需的功能,只有允许将图像保存到文件的例子);

$contentType = 'image/png';
ob_start();
$graph->Stroke();
$image_data = ob_get_clean();

$str = "data:$contentType;base64," . base64_encode($image_data);
echo $str;
exit;

答案 2 :(得分:1)

我做了Lightness所说的,但我必须改变以下内容才能发挥作用:

data:$contentType;base64;data:$contentType;base64,

即逗号而不是分号。

答案 3 :(得分:0)

这将返回GD资源:

$gdImgHandler = $graph->Stroke(_IMG_HANDLER);

延伸:

ob_start();
imagepng($gdImgHandler);
$image_data = ob_get_contents();
ob_end_clean();

echo $str = "data:$contentType;base64," . base64_encode($image_data);

当我在memcached中为统计信息base64编码缓存大图时,我使用此代码,所以我知道它正在工作。如果您不使用PNG,请将imagepng()替换为imagejpeg()或其他内容。