我正在开发一个使用动态创建的图像来显示信息的网络应用程序。此数据当前使用 GET 查询字符串发送到图像,但对于更复杂的图像和数据,我担心会遇到 url 字符限制问题。
我可以简单地将记录 ID 传递给图像并让这个查询数据库,但这显然会增加对服务器的需求。有什么方法可以将使用 POST 检索到的图像添加到 HTML 文档中?
最后,我认为查询数据库可能会更快。从数据库中获取一个小字符串(比如最多 2000 个字符)非常快,并且可能比让用户一直发布它更快,尤其是当页面上超过 1 个时。
最好的选择是创建一次图像并在它不改变时将其缓存。当再次请求图像时,检查它是否被缓存并使用 readfile() 将其发送到浏览器。我喜欢将缓存的图像存储在文档根目录之外,因此其他人无法访问它,但这可能不是您正在做的事情(缓存和隐私)的一个因素。
SESSION 可能是一个选项,但是当您需要在多个页面上重新生成图像并进行细微更改时,这是最佳选择,因此您不必每次都查询数据库。
不容易 - HTML 不包含任何对发送多个 POST 请求并将结果呈现为内联资源的内在支持,就像 <img /> <script /> 和其他定义 SRC 属性的标签一样。
即使是 AJAX 变通方法也可能对您没有帮助。更改图像的 SRC 属性很容易,但所做的只是使浏览器获取新图像(从缓存或服务器,取决于您的配置)。实际上,将图像的内容从 HTTP POST 更改为二进制响应要复杂得多——尽管您可以查看对响应流进行 base64 编码并使用 data: URL 方案在页面中显示结果图像。
当然,您始终可以将“单击以查看图像”作为提交按钮的表单 - 您提交表单,服务器以图像/jpeg 数据响应,您的浏览器将其显示为独立图像。不过,我很确定你不能内联。
一种选择是将此数据存储在会话变量中。您应该做一些测试,看看您的服务器以哪种方式更好地处理它
扩展 Darryl Hein 的评论:
有了这个,我建议您在完成后将其从 SESSION 中删除。如果它一直在那里,PHP 将在每次页面调用时加载它,而不仅仅是图像“页面”。——达里尔·海因
是的,我考虑过这一点并同意,您不想用不需要的会话数据堵塞管道,但是如果您不知道何时删除数据怎么办?不能只删除图片创建后的会话数据,如果图片要显示两次怎么办?除非图像本身被缓存了一段时间。
像这样的东西
请求页面
<? //index.php
$_SESSION['imagedata']['header'] = array('name'=>'Simon','backgroundcolor'=>'red');
echo '<img src="image.php?image=header">';
// more stuff
echo '<img src="image.php?image=header">'; // same image
?>
图像脚本
<? //image.php
switch($_GET['image']){
case 'header':
if(isSet($_SESSION['imagedata']['header'])){
// create image using $_SESSION['imagedata']['header'] data
// create cached image
unset($_SESSION['imagedata']['header']);
else if(cache_file_exists()){
// display cached file
}else{
// no data, use plan B
}
break;
}
?>
如果图像可以通过 id 识别,请使用它。假设相同的 id 每次都应该生成相同的图像,只需使用一些代理使用标准 HTTP 缓存支持来提供图像。
在某些情况下并在某些限制下,您可以使用 iframe,您希望您的图像出现并使用指向该 iframe 的目标属性发布。
所以主页有一个iframe。主页有一个发布 I 框架的表单,服务器返回一个显示在 iframe 中的图像。