限制对文件的访问 - 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 路径并能够查看内容的人。
我们为此使用的解决方案如下:
- 将 PDF 文件存储在 外部 网络目录
- 通过脚本访问 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 派生的或者有一个文件查找系统等
请考虑以下事项:
我有一个网站,用户可以将内容上传为 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 路径并能够查看内容的人。
我们为此使用的解决方案如下:
- 将 PDF 文件存储在 外部 网络目录
- 通过脚本访问 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 派生的或者有一个文件查找系统等