Пожалуйста, примите во внимание следующее:
У меня есть веб-сайт, на который пользователи загружают контент в формате 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-пути и возможность просматривать содержимое.
Создайте 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 или у вас есть система поиска файлов и т. Д.
Решение, которое мы используем для этого, заключается в следующем:
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);
}