所以我需要一些关于我正在编写的PHP脚本的帮助,它通过PHP脚本在新选项卡中加载PDF。我这样做是为了确保只有用户登录并且有链接才能访问PDF,否则PDF目录的父目录中的.htaccess会阻止访问。
我可以使用以下代码从PDF中读取:
$file = '../path-to-file.pdf';
$filename = 'filename.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
@readfile($file);
然后将结果传递给下面显示的AJAX函数,该函数生成一个新选项卡并将响应抛出到它上面:
$.ajax({
url: '../includes/function.projects.php?view-media=' + item,
success: function(data) {
$(window.open().document.body).html(data);
}
})
这一切都很顺利,只有当新标签打开时才会这样,因为我正在直接写回文件HTML,我得到的屏幕上写满了这样的文字:
%PDF-1.5 %���� 2 0 obj << /Linearized 1 /L 17007 /H [ 687 126 ] /O 6 /E 16732 /N 1 /T 16731 >>
所以我的问题很简单;有没有人试过设法做到这一点?如果是的话,是否有我应该使用的库/标题我没有等等。
我已经在这里看到了这个问题,但我无法得到人们列出来的答案,所以我没有想法。
任何帮助都将不胜感激,提前致谢!
答案 0 :(得分:3)
是的,所以我有一个解决方案。如果有人可以提出更好的方法,请告诉我,但现在这完美!我找到了一个名为PDFObject的JS库,它可以用来制作跨浏览器的解决方案,以便轻松地将PDF嵌入到html文档中。有了这个,我可以在服务器上传递一个PDF链接以及一个目标div,以便嵌入(在我的情况下,我已经设置了一个模态,所以我们保持在同一页面上)。
因为我们停留在同一页面上,所以我可以使用我之前在项目中编写的函数阻止访问整个页面,如果用户没有正确的访问级别,则会将用户重定向到索引。有些事情可行:
function checkSession() {
if(empty($_SESSION)) {
header("Location: /?cheeky_monkey");
}
}
如果用户试图直接访问PDF,则htaccess中的此代码会阻止它们。它只允许通过应用程序进行目标访问:
SetEnvIf Referer "localhost" is_local_referer
<FilesMatch "\.pdf$">
Require env is_local_referer
</FilesMatch>
除此之外,所有需要发生的事情是在脚本标记处抛出一个URL,以便在点击PDF时加载,通过以下代码序列完成:
- 首先,我们需要获取PDF的URL(您可能可以跳过此步骤)
醇>
首先,只要有人点击查看PDF(此调用只是嵌套为onclick属性),就会调用此javascript:
function viewMedia(projectID, type, item) {
$.ajax({
url: '../includes/function.projects.php?cid=' + projectID + '&type=' + type + '&view-media=' + item,
success: function(data) {
$('.pdf-script').html('<script>PDFObject.embed("' + data + '", "#the-pdf");</script>');
$('#viewMediaModal').modal('toggle');
}
})
}
这是在php页面上运行的代码。
public function viewMedia($item) {
$mediaItems = unserialize($this->media);
$file = '/path/to/pdf/' . $mediaItems[$item]['file'];
echo $file;
}
此函数返回数据的示例:
/path/to/pdf/example-pdf.pdf
- 使用此方法加载PDF
醇>
一旦我们获得了PDF的正确URL并且AJAX返回成功,收到的数据可用于重新生成javascript,这次使用新的PDF链接:
success: function(data) {
$('.pdf-script').html('<script>PDFObject.embed("' + data + '", "#the-pdf");</script>');
$('#viewMediaModal').modal('toggle');
}
这就是那个模态体的结构:
<div class="modal-body">
<div id="the-pdf"></div>
<div class="pdf-script" style="display: none;">
<script>PDFObject.embed('', '#the-pdf');</script>
</div>
</div>
- 结果
醇>