0

PDF 生成依赖于 $_POST

我在浏览器中使用 PHP 脚本生成 PDF,其中生成 PDF 的脚本取决于通过 POST 发送给它的变量。当 POST 为空时,无法生成 PDF,并发出警告“必须重新生成 PDF”。

某些情况会触发 POST 数组为空,即,如果我在 PDF 页面上点击浏览器的刷新按钮,无论出于何种原因,POST 数据都不会重新发送,也没有提示要求我重新发送它,它只是变成空的并且脚本检测到它并发出警告。警告是PDF Must be Regenerated,这是我在代码中 POST 数组为空时输入的内容。

PDF 生成解决方法取决于 $_SESSION

所以我做的一个解决方法是将 POST 数据保存到 SESSION ,然后在 POST 为空时使用 SESSION 。如下所示:

if (empty($_POST))
{
    // try restore from session first
    $_POST['product_count'] = $_SESSION['product_count'];

    if (empty($_POST['product_count'])) // if we failed.. session is empty
    {
        print 'PDF Must be Regenerated';
        exit();
    }
}
else
{
    //save POST into SESSION
    $_SESSION['product_count'] = $_POST['product_count'];
}

浏览器的保存功能尝试在 SESSION 过期后生成 PDF

在用户开始注意到某种行为之前,一切都很好:

  1. 他们使用脚本生成 PDF
  2. 让浏览器闲置一段时间做其他的事情,直到SESSION在幕后过期
  3. 然后他们使用浏览器的另存为功能来保存 PDF。

我们公司使用的浏览器 (Mozilla) 不是从内存中保存 PDF(PDF 在浏览器中仍然可见),而是向服务器发出请求,请求 PDF 的新副本。但是......这样做时,POST 是空的,因为 POST 没有被重新发送,而 SESSION 是空的,因为 SESSION 在空闲阶段已经过期。

这会导致 PDF 损坏,其中 PDF 实际上是包含 words 的 ASCII 文本文件PDF Must be Regenerated。直到为时已晚,用户才注意到它。

但是,Mozilla 显然调用了服务器,PHP 脚本通过了用户登录凭据测试,但始终有空的 POST 和 SESSION,导致 PDF 损坏。

登录凭据检查不依赖于 SESSION,老实说,我还不能确定它依赖于什么,因为我无法轻松重现该问题,因此无法轻松测试。

解决方法显然是在 PDF 生成后不久保存 PDF,在 SESSION 过期之前,但用户“永远正确”,我想让用户即使在 SESSION 过期时也能够保存 PDF。我的问题是“如何”。

如何?我能做些什么?

4

1 回答 1

0

pdf 的东西似乎肯定是浏览器上的一个错误。但无论如何,您都想使用 GET。

post 是执行一个动作,并且浏览器正确地不会重新发出该请求。从您的描述来看,似乎没有查看 pdf 正在执行操作。

如果您使用 GET,则意味着使用这些参数获取这些数据。浏览器会相应地处理它。

如果是动作的结果,则将动作和报告分成两个请求。例如,将查看生成的 PDF 报告作为操作响应中的链接。例如,当您在线购买某人时,您可以看到这种模式。付款 POST 请求通过 GET 为您提供发票的链接。

于 2015-03-13T22:03:17.377 回答