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

Restrict access to file - PDF.JS

请考虑以下事项:

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

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

我尝试使用 .htaccess 仅允许加载来自服务器 IP 地址的 PDF 但无济于事 - 它似乎阻止了使用 PDF.js[=13 提取 PDF 的任何尝试=]

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

请记住,我使用的是稳定版下载网页目录中 viewer.js 中的代码 - 我无法在 PDF.JS 上获得任何 "Examples"网站工作,特别是这一行: var pdfjsLib = window['pdfjs-dist/build/pdf']; - 这将归结为我有限的知识。如果有人能够解释这一点,奖金。

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

编辑

只是为了确认,因为我认为我最初不是很清楚,我仍然希望用户能够通过具有 PDF.JS 的网页查看内容,但是我不希望只是任何进入直接 URL 路径并能够查看内容的人。

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

  1. 将 PDF 文件存储在 外部 网络目录
  2. 通过脚本访问 PDF(PHP 或其他,在我的例子中我们称之为 download_file.php)并使用 read file chunked 函数将其提供给您的客户。

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

这样,您的 PDF.JS 文件可以 link 到 download_file.php?file_id=123123 而不是 my_read_file.pdf,您的脚本可以 link 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);
}

创建 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 派生的或者有一个文件查找系统等