限制对文件的访问-PDF.JS

时间:2018-10-03 16:14:17

标签: php .htaccess pdf pdf.js

请考虑以下内容:

我有一个网站,用户可以将内容上传为PDF。我想以某种方式限制对此内容的访问。该计划的目的是使PHP脚本对用户进行身份验证,然后使用PDF.JS加载本地PDF,以便在所有设备上均可使用。

我正在使用viewer.js提供的代码。

我尝试使用.htaccess仅允许从服务器IP地址加载PDF的情况下加载PDF,但无济于事-它似乎阻止了任何使用PDF.js提取PDF的尝试

PDF.JS中是否有一种方法可以强制它在本地加载文件,而不是将其下载为URL?也许那我可以在.htaccess中deny all并仍然允许PDF.js加载它?

请记住,我正在使用稳定下载的Web目录中的viewer.js中找到的代码-我无法使PDF.JS网站上的任何“示例”正常工作,特别是以下行: var pdfjsLib = window['pdfjs-dist/build/pdf'];-这取决于我的有限知识。如果有人能够解释这一点,那就加分。

我完全愿意采用其他方法来解决此问题,希望有人能告诉我这是一个糟糕的主意,并提供了更好的解决方法。

修改

只是确认一下,因为我起初并不十分清楚,我仍然希望用户能够通过具有PDF.JS的网页查看内容,但是我不希望任何人去浏览直接URL路径并能够查看内容。

2 个答案:

答案 0 :(得分:2)

创建pdf.php作为获取PDF文件的端点:

<?php

$file = "tracemonkey.pdf";

if(!$loggedIn) return; // Update with your logic

header("Content-type: application/octet-stream");
header("Content-disposition: attachment;filename=" . $file);

echo file_get_contents(__DIR__ . '/' . $file);

然后在JS查看器中只需换出URL:

var url = 'pdf.php';

通过这种方式,PHP充当文件的代理,您需要引入自己的逻辑来抓取文件以及您认为是经过身份验证的用户,无论是从GET派生还是拥有文件查找系统等

答案 1 :(得分:1)

我们为此使用的解决方案如下:

  1. 将PDF文件存储在网络目录的外部
  2. 通过脚本(PHP或其他脚本,在我的情况下称为download_file.php)访问PDF,然后使用read file chunked函数将其提供给客户端。

您的脚本可以验证会话,检查用户的权限,然后读取文件并将正确的HEADER发送给用户。因此,它比直接访问文件要灵活得多。

这样,您的PDF.JS文件可以链接到download_file.php?file_id=123123而不是my_read_file.pdf,而脚本可以将file_id 123123链接到实际的PDF。

我的download_file.php脚本看起来像这样:

//$filename : full path to your actual file. NOT located in your web directory
//$mime : mime type of your file

header('Pragma: public');
header('Cache-Control: private');
header('Expires: '.gmdate("D, d M Y H:i:s", strtotime("+2 DAYS", time())). " GMT");
header('Last-Modified: '. gmdate("D, d M Y H:i:s", time()). " GMT");
header('Content-Length: '.filesize($filename)); // Get the file size manually
header('Content-type: '. $mime);

set_time_limit(0);
readfile_chunked($filename);

function readfile_chunked ($filename) {
  $chunksize = 1*(1024*1024); // how many bytes per chunk
  $buffer = '';
  $handle = fopen($filename, 'rb');
  if ($handle === false) {
   return false;
  }
  sleep(1);
  while (!feof($handle)) {
   $buffer = fread($handle, $chunksize);
   //if (strlen($buffer) < $chunksize)
   //   $buffer = str_pad($buffer, $chunksize);
   print $buffer;
   // 2006-01-26: Added 
   flush();
   @ob_flush();
 }
  return fclose($handle);
}