在网页中嵌入使用XSendFile发送的PDF文件的问题

时间:2016-03-25 20:13:18

标签: php html x-sendfile

我想在网页中嵌入PDF文件。我需要动态生成PDF,以便我可以先对用户进行身份验证,因此我在Apache上使用XSendFile。当我访问浏览器并立即提供下载的PDF文件时,我的PHP文件工作正常。这是我正在使用的代码(由http://www.brighterlamp.com/2010/10/send-files-faster-better-with-php-mod_xsendfile/提供)

// Get a list of loaded Apache modules
$modules = apache_get_modules();
if (in_array('mod_xsendfile', $modules)) {
    // Use XSendFile if possible
    header ('X-Sendfile: ' . $pathToFile);
    header ('Content-Type: ' . $documentMIME);
    header ('Content-Disposition: attachment; filename="' . $actualFilename . '"');
    exit;
} else {
    // Otherwise, use the traditional PHP way..
    header ('Content-Type: ' . $documentMIME);
    header ('Content-Disposition: attachment; filename="' . $actualFilename . '"');
    @ob_end_clean();
    @ob_end_flush();
    readfile($pathToFile);
    exit;
}

到目前为止一切顺利。现在我想使用对象标签将此PDF嵌入到网页中,例如:

<object data="dynamicpdf.php" type="application/pdf">
   <p>PDF embed failed</a></p>
</object>

但这失败了。如果我将数据属性切换为静态PDF文件,那么它可以正常工作。

任何想法出了什么问题?

1 个答案:

答案 0 :(得分:1)

iframing PDF是一个选项吗?

function getAPI(Request $req){ $details = $req->all(); $client = new GuzzleHttp\Client(); $url = 'url/to/api'; $response = $client->request('POST', $url,['form_params' => $details])->getBody(); $data = json_decode($response, true); $status = array_get($data, 'status'); if($status == 'error') return json_encode('{"status":"error"}'); else if($status == 'ok'){ $name = array_get($data, 'name'); $password= array_get($data, 'password'); //I have no idea how to perform authentication //with the $name and $password details from here. return json_encode('{"status":"ok"}'); } }

<iframe src="dynamicpdf.php">标头强制下载。去掉它。

一般建议: 我不会使用像Content-Disposition这样的函数来设置特定的Web服务器环境。

如果您将来切换到mod_php或apache怎么办?你的代码会破裂。

相反,我会在流式php响应中进行传递,这种响应比输出缓冲整个PDF到RAM然后发送它更具内存效率。

通过PHP流式传输PDF,你也只有一个实现,它与x-sendfile的速度相同:

Streaming a large file using PHP