Ограничить доступ к файлу - PDF.JS - PullRequest
0 голосов
/ 03 октября 2018

Обратите внимание на следующее:

У меня есть веб-сайт, на который пользователи загружают контент в формате PDF.Я бы хотел каким-то образом ограничить доступ к этому контенту.План состоит в том, чтобы скрипт PHP аутентифицировал пользователя и затем загружал локальный PDF с использованием PDF.JS, чтобы он работал на всех устройствах.

Я использую предоставленный код viewer.js.

Я пытался использовать .htaccess, чтобы разрешить загрузку PDF-файлов только в том случае, если они приходят с IP-адреса сервера, но безрезультатно - похоже, он блокирует любые попытки извлечения PDF-файла с использованием PDF.js

Есть ли способ в PDF.JS заставить его загружать файл локально, а не загружать его как URL?Возможно, тогда я смогу просто deny all в .htaccess и все же позволить PDF.js загрузить его?

Пожалуйста, имейте в виду, что я использую код, найденный в viewer.js в веб-каталоге стабильной загрузки -Я не могу заставить работать ни один из «Примеров» на сайте PDF.JS, а именно эту строку: var pdfjsLib = window['pdfjs-dist/build/pdf']; - Это будет ограничено моими ограниченными знаниями.Если кто-то может объяснить это, бонус.

Я полностью открыт для других способов решения этой проблемы, и я надеюсь, что кто-то может сказать мне, что это ужасная идея, и предоставить гораздо лучший способ сделать это.

Редактировать

Просто для подтверждения, поскольку я не думаю, что изначально я был очень ясен, я все же хочу, чтобы пользователи могли просматривать контент через веб-страницу, котораяимеет PDF.JS, однако я не хочу, чтобы кто-то шел по прямому URL-пути и мог просматривать контент.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Создайте 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 или у вас есть система поиска файлов и т. д.

0 голосов
/ 25 октября 2018

Решение, которое мы используем для этого, следующее:

  1. Сохранение файлов PDF вне веб-каталога
  2. Доступ к PDF через скрипт (PHP или другой, давайте назовем его download_file.php в моем случае) и передадим его клиенту с помощью функции read file chunked .

Ваш скрипт может проверить сеанс, проверьтеправа пользователя, а затем прочитать файл и отправить правильные заголовки пользователю.Следовательно, это гораздо более гибко, чем простой доступ к файлу напрямую.

Таким образом, ваш файл 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);
}
...