【问题标题】:How can I show the result of a POST request as an image?如何将 POST 请求的结果显示为图像?
【发布时间】:2010-09-15 09:23:07
【问题描述】:

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

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

【问题讨论】:

    标签: html ajax image post get


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      不容易 - HTML 不包含对发送多个 POST 请求并将结果呈现为内联资源的任何内在支持,就像 和其他定义 SRC 属性的标签一样。

      即使是 AJAX 变通方法也可能对您没有帮助。更改图像的 SRC 属性很容易,但所做的只是使浏览器获取新图像(从缓存或服务器,取决于您的配置)。实际上,将图像的 content 更改为来自 HTTP POST 的二进制响应要复杂得多 - 尽管您可以查看 base64 编码响应流并使用 data: URL 方案来显示结果图像在您的页面中。

      当然,您始终可以使用“单击查看图像”作为提交按钮的表单 - 您提交表单,服务器以图像/jpeg 数据响应,您的浏览器将其显示为独立图像。不过,我很确定你不能内联。

      【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 有了这个,我建议您在完成后将其从 SESSION 中删除。如果它一直在那里,PHP 将在每次页面调用时加载它,而不仅仅是图像“页面”。
      【解决方案4】:

      扩展 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;
          }
      ?>
      

      【讨论】:

      • 但是你还必须有某种程序在一段时间后清除那些缓存的图像
      • "如果图像要显示两次怎么办?"这不太可能是一个问题,因为应用程序显示图像,并且只在页面上这样做一次,如果我将此功能移动到 AJAX,应用程序每次都可以简单地添加 cookie。
      【解决方案5】:

      如果图像可以通过 id 识别,请使用它。假设相同的 id 每次都应该生成相同的图像,只需使用一些代理使用标准 HTTP 缓存支持来提供图像。

      【讨论】:

        【解决方案6】:

        在某些情况下,在某些限制下,您可以使用一个 iframe,您希望您的图像出现并发布一个指向该 iframe 的目标属性。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-16
          • 1970-01-01
          • 1970-01-01
          • 2023-01-17
          相关资源
          最近更新 更多