我正在开发一个Web应用程序,其中动态创建的图像用于显示信息。此数据当前使用GET查询字符串发送到图像,但是更复杂的图像和数据我担心会遇到网址字符限制的问题。

我可以简单地将记录ID传递给图像,并将此查询存储到数据库中,但这显然会增加对服务器的需求。有什么方法可以将使用POST检索到的图像添加到HTML文档中吗?

有帮助吗?

解决方案

最后,我认为查询数据库可能会更快。从数据库中获取一个小字符串(例如最多2000个字符)非常快,并且可能比用户一直发布它更快,特别是如果页面上有超过1个字符串。

最好的选择是创建一次图像,如果它没有改变则缓存它。再次请求图像时,检查它是否已缓存,只需使用readfile()将其发送到浏览器。我喜欢将缓存的图像存储在doc root之外,因此其他人无法访问它,但这可能不是您正在做的事情(缓存和隐私)的一个因素。

SESSION可能是一个选项,但是当您需要在稍微更改的情况下在多个页面上重新生成图像时,这是最佳选项,因此您不必每次都查询数据库。

其他提示

不容易 - HTML不包含任何内部支持,用于发送多个POST请求并将结果呈现为内联资源,就像<!> lt; img / <!> gt; <!> lt; script / <!> gt;以及定义SRC属性的其他标记。

即使是AJAX解决方法也许对您没有帮助。更改图像的SRC属性很简单,但所有这一切都会导致浏览器获取新图像(来自缓存或服务器,具体取决于您的配置)。实际上,将图像的内容更改为来自HTTP POST的二进制响应更为复杂 - 尽管您可以查看base64编码响应流并使用data:URL方案来显示生成的图像在你的页面。

您总是可以使用带有<!>的表单;点击查看图片<!>作为提交按钮,当然 - 您提交表单,服务器使用image / jpeg数据进行响应,并且您的浏览器将其显示为独立图像。不过,我很确定你不能内联。

一个选项可能是将此数据存储在会话变量中。你应该做一些测试,看看你的服务器处理它的方式更好

扩展Darryl Hein的评论:

  
    

有了这个,我建议你完成后从SESSION中删除它。如果它一直在那里,PHP将在每次页面调用时加载它,而不仅仅是图像<!> quot; page <!> quot;。 <!> 8211#;达里尔海因

  

是的,我想到了这一点并同意,你不想用不需要的会话数据堵塞管子,但如果你不知道何时删除数据怎么办?创建图像后,您不能只删除会话数据,如果图像要显示两次,该怎么办?除非图像本身被缓存一段时间。

像这样的东西

请求页面

<? //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识别,请使用它。假设每次使用标准HTTP缓存支持时,只需使用一些代理服务图像,相同的id应生成相同的图像。

在某些情况下,在某些限制条件下,您可以使用iframe,您希望图片显示在apear上,并使用指向该iframe的目标属性进行发布。

所以主页面有一个iframe。主页面有一个发布I帧的表单,服务器返回iframe中显示的图像。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top