Ограничить доступ к файлу — PDF.JS

Пожалуйста, примите во внимание следующее:

У меня есть веб-сайт, на который пользователи загружают контент в формате 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-пути и возможность просматривать содержимое.

1

Решение

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

2

Другие решения

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

  1. Храните файлы PDF вне веб-каталога
  2. Доступ к PDF через скрипт (PHP или другой, давайте назовем его download_file.php в моем случае) и скормить его клиенту, используя читать файл по частям функция.

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

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

По вопросам рекламы [email protected]