我使用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所示。
答案 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。