内联生成的图像超出长度

时间:2012-01-11 14:43:20

标签: php html image base64

我使用PHP生成图像,这很好用。我无法显示这些图像:

我的图像生成器是一个PHP文件,它需要大量参数和大量数据才能生成图像。由于必须传递给生成器的数量过多,使用GET容器对我来说不起作用,因此数据通过POST请求发送。此请求的结果是原始图像数据。

我正在使用

$result = post_request('http://myurl.com/graphx/generator.php', $data);
if($result['status'] == 'ok') {
    echo "<img src=\"data:image/png;base64,".
        base64_encode($result['content'])."\"/>\n";
}

显示我的图片。这适用于非常小的图像,但随着它们变大(例如300px * 300px),图像不再显示(它似乎在某处被切割)。

我的方法合理吗?

是否有针对尺寸问题的解决方法?

更新

当我让生成器将图像保存到文件时,创建的文件包含我想要的图像。此外,如果将我的生成器转换为GET生成器,以下代码也可以正常工作:

$data = http_build_query($data);
echo "<img src=\"http://myurl.com/graphx/get_generator.php?{$data}\"/>\n";

因此,无论是POST请求还是转换为base64格式,这似乎都是一个问题。我正在使用POST请求,如here所示。

3 个答案:

答案 0 :(得分:3)

我建议您的网页结构如下:

主页:

<img src="imageproxy.php" />

imageproxy.php:

<?php
$result = post_request('http://myurl.com/graphx/generator.php', $data);
header('Content-type: image/png');
if($result['status'] == 'ok') {
    echo $result['content']);
} else {
    readfile('error_message_image.png');
}

而不是尝试使用数据uris和长度限制,只需让您的代理脚本输出实际的原始图像数据,并将其视为客户端html中的图像。

答案 1 :(得分:1)

为什么不base64参数并将其放入GET请求中,并做一个简单的事情:

<img src="/path/to/php.php?p=eyJ0aGlzIjoiaXMiLCJhIjoiYmVhdXRpZnVsIiwic2V0Ijoib2YiLCJwYXJhbWV0ZXJzIjoiISEifQ==" />

然后在php.php base64_decode($ p)上返回图像。

在php.php上更好,使用apache(https://tn123.org/mod_xsendfile/)的X-Sendfile mod,也许在本地缓​​存图像,这样你就不必一直重新创建它

编辑:

我不知道我们在这里谈论了多少参数。如果你去看What is the maximum length of a URL in different browsers?,你会发现经验表明URI大约有2000个字符。

所以这取决于你的base64编码字符串是否小于你的安全。否则你可以考虑其他编码方式。也许yEnc或base85?

更进一步,你可以在本地存储(即RDBMS)上存储一个序列化对象(包含所需的参数),将其与id链接并传递该id。当php.php获取id时,在存储上查找它会检索参数创建图像,依此类推。

答案 2 :(得分:1)

根据http://en.wikipedia.org/wiki/Data_URI_scheme IE 8(如果它们支持它,可能在下面)“将数据URI限制为最大长度为32 KB”。这可能是你所看到的,如果它只读取你发送的任何东西的第一个32k。

相关问题