【问题标题】:send pdf to browser after ajax callajax调用后将pdf发送到浏览器
【发布时间】:2012-03-25 11:21:34
【问题描述】:

我有一个通过 ajax 调用调用的 php 脚本。将值发送到此脚本以构建 pdf。我想将 pdf 发送到浏览器,但是由于构建 pdf 的脚本返回到带有 javascript 的页面,所以我看不到如何执行此操作。有什么想法吗?

【问题讨论】:

    标签: php javascript ajax


    【解决方案1】:

    我会推荐一些不同的东西。而不是 AJAX 调用重定向到这样的 URL:

    ./path_to_pdf_script/script.php?param1=val1&param2=val2
    

    这个脚本将是生成 pdf 的脚本。将此标题放在脚本顶部的某个位置:

    header('Content-type: application/pdf');
    

    只需echo pdf 内容所在的字符串。如果您希望用户下载此 pdf 而不是查看,您可以使用找到的示例进行 AJAX 调用 HERE:

    来自 php.net

    如果您希望提示用户保存您发送的数据, 例如生成的 PDF 文件,可以使用 » Content-Disposition 标头提供推荐的文件名并强制浏览器 显示保存对话框。

    <?php
    // We'll be outputting a PDF
    header('Content-type: application/pdf');
    
    // It will be called downloaded.pdf
    header('Content-Disposition: attachment; filename="downloaded.pdf"');
    
    // The PDF source is in original.pdf
    readfile('original.pdf');
    ?>
    

    【讨论】:

    • 所有这些都是发送 pdf 文件的常用方法,我认为这可能是处理问题的首选方法,但它不能回答问题。如果PDF是通过AJAX生成的,在网页的后台,那么文件准备好了怎么发送呢?
    • 是的,你的权利,也许一些临时文件可以解决问题,ajax 调用转到 pdf 生成器,生成 pdf 并将其保存到临时文件,将 pdf 文件名保存到会话,将 ok 发送回客户端,然后从那里重定向到一个 pdf-server 脚本,该脚本从会话中获取文件名,读取它,提供它并删除它
    【解决方案2】:

    您可以使用 iframe 代替 ajax 请求并强制下载 pdf 文件。

    【讨论】:

      【解决方案3】:

      如您所见,您的 AJAX 调用无法直接将 PDF 输出到浏览器。一种解决方法是删除 AJAX 并将用户直接发送到生成 PDF 的页面。这种方法非常常见并且有据可查。但是有一种方法可以使用 AJAX 来生成 PDF,这样用户就会一直呆在网页上,直到文件准备好。

      您的 AJAX 调用可以使用具有 2 个专有字段的 JSON 对象进行应答:

      • “pdfurl”如果成功创建pdf文件并写入磁盘,
      • “errormsg”如果有错误。

      类似(在 PHP 中):

      <?php
      //...
      if (writepdf($filename, ...)) {
          $result = array('pdfurl' => '/files/' . $filename);
      } else {
          $result = array('errormsg' => 'Error!');
      }
      echo json_encode($result);
      

      那么页面的 javascript 可以包含(jQuery 示例):

      $.ajax({
          type: "GET",
          url: "ajaxcreatepdf.php",
          data: {userid: 1},
          dataType: "json",
          success: function(data, textStatus) {
              if (data.pdfurl) {
                  window.location.href = data.pdfurl;
              }
              else {
                  $("#messagebox").html(data.errormsg);
              }
          }
      });
      

      【讨论】:

        【解决方案4】:

        Ajax 请求对用户不直接可见,因此重定向没有意义

        您需要在 ajax 返回后将此 PDF 加载到现有或新的浏览器窗口中。

        【讨论】:

        • 您是否尝试过在 AJAX 调用中发送重定向标头?如果我没记错的话它会重定向浏览器,即使它只是 AJAX
        • 不,因为我认为这很奇怪。根据stackoverflow.com/questions/2927044/…ajax-redirect 需要编程
        • 考虑你有两个 Ajax 调用。两者都进行重定向。谁应该赢?
        猜你喜欢
        • 2010-10-18
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        相关资源
        最近更新 更多