将pdf从wp_remote_get发送到浏览器

时间:2017-08-18 18:35:17

标签: wordpress pdf

我将wordpress网站与外部API集成在一起。我有一个表单发布到我的服务器,我在我的服务器上调用一个函数,该函数对外部API进行wp_remote_get调用。

外部API返回PDF,标题如下:

        [date] => Fri, 18 Aug 2017 15:59:19 GMT
        [x-powered-by] => Servlet/3.0
        [cache-control] => no-cache
        [content-type] => application/pdf;charset=utf-8
        [content-language] => en-US

响应正文是令人讨厌的字符串格式的PDF,这似乎是一个好的开始。

如何将此PDF传递给用户的浏览器? 即,

$response = wp_remote_get( $url, array ( //stuff the request needs));
if (is_wp_error ($response)) {
    $error_message = $response->get_error_message();
    echo "Something went wrong: $error_message";
} else {
    //What here?
}

我必须首先点击我的服务器,不能将表单直接发布到外部API。

1 个答案:

答案 0 :(得分:0)

我通过使用javascript将我的表单提交重定向到我的网站上的新窗口,并将表单信息作为URL参数传递给我。 即 在我的HTML中:

<form onsubmit="return qrsDownload()">

然后在javascript中:

function qrsDownload() {
    // a bunch of jquery and processing to build the URL..
    window.open(url, 'My Title', 'width=800, height=600');
}

我打开的页面是我创建的一次性页面模板,我省略了标准WP模板(所以没有标题,没有页脚,没有wordpress循环),并且在该页面的php文件中:

<?php 
if (isset($_GET['someParam'])) {
  // started off with logic to verify that I had the params needed
  // because anybody could just jump directly to this page now
}
$url = "whateverurl.com/myendpoint";
// additional logic to set up the API call
$server_response = wp_remote_get($url, $args);
if (is_wp_error( $server_response) ) {
    // do something to handle error
} else {
    // PASS OUR PDF to the user
    $response_body = wp_remote_retrieve_body( $server_response);
    header("Content-type: application/pdf");
    header("Content-disposition: attachment;filename=downloaded.pdf");
    echo $response_body;
}
} else {
     get_header();
    $html = "<div class='content-container'><p>A pretty error message here.</p></div>";
     echo $html;
     get_footer();
}

?>

该方法基本上是将API的结果直接传递给用户,但是您需要标题来指定它是PDF,并且必须在写出任何输出之前设置标题。确保这一点的一种更简单的方法是在新窗口中进行,而不是严格地在表单回发上进行。