[英]Prevent PDF auto download by idm using pdf.js
我正在使用PDF.Js嵌入 PDF 文件进行预览,并从viewer.js
中删除了下载和打开文件的脚本,但是当我测试页面和 ZBCD1B68617759B1DFCFF0403A6B 下载管理器时尝试显示它,Internet中止预览.. 搜索后我发现使用object
而不是iframe
可能会解决问题,但它没有工作 pdf 查看器出现白色,我该怎么做才能防止自动下载? 或使用其他方式(插件)显示 PDF 文件内容。
<iframe
class="pdf"
webkitallowfullscreen=""
mozallowfullscreen=""
allowfullscreen=""
frameborder="no"
width="'.$width.'"
height="'.$height.'"
src="'.$baseurl.'/assets/pdf/web/viewer.html?file='.urlencode($pdf_url).'"
data-src="'.$pdf_url.'">
'.$pdf_url.'
</iframe>
这与开发问题无关,这与用户特定环境有关。
问题 :
使用IDM ,任何以媒体扩展名结尾的 URL(例如 *.JPG , *.PNG , *.MP4 , *.WMV , *.PDF ..etc )都将被自动下载,但是另一方面,如果用户没有已安装IDM ,文件将立即在浏览器窗口中查看。
可能的解决方案 :
最后注:
作为开发人员,您不应该处理每个用户特定的环境,我们假设当用户安装特定应用程序来处理通用文件时,处理该应用程序是他/她的角色,而不是开发人员角色,因为如果您遵循此算法,您跳入无限循环处理不同用户的特定设置。
只需从主文件中删除.pdf
扩展名。 IDM 无法检测到它是什么类型的文件。 但浏览器将处理其本机方式。
试试这个
<embed src="'.$baseurl.'/assets/pdf/web/viewer.html?file='.urlencode($pdf_url).'" type="text/html" >
可以防止从 idm (PdfJs) 自动下载。 IDM查找扩展pdf文件,因此我们需要将pdf文件转换为base-64,然后将pdf的base64读取到节点DOM src中:
1.将您的文件pdf转换为base64
document.getElementById('myfiles').addEventListener('change', function(event){ var input = document.getElementById("myfiles"); var fReader = new FileReader(); fReader.readAsDataURL(input.files[0]); fReader.onloadend = function(event){ document.getElementById("base64").innerHTML = event.target.result; console.log(event.target.result); } });
<input type="file" name="files" id="myfiles" value=""><br> <textarea id="base64" cols="50"></textarea>
2.将所有字符串base64放到txt文件中
文件名.txt
3. 从文件 txt 中读取 base64 并粘贴到 iframe 或使用 viewer.js (PDF JS)
- iframe 应该
<iframe scr="data:application/pdf,base64.....">prevent download from idm</iframe>
-带有 PDF 查看器
var xhr = new XMLHttpRequest(); console.log(file); xhr.open('GET', folderFiles+filename+".txt", true); xhr.responseType = 'text'; xhr.onload = function(e) { if (this.status == 200) { PDFViewerApplication.open(this.response); } };
因此,IDM 不会因为找不到特定文件而自动强制下载 pdf 文件。 链接: https ://github.com/sokhasen/ViewerPDF.git
从您的评论来看,我会说您的 uri 可能不正确。
您可以尝试用任何在线pdf文件替换uri,看看其余代码是否正常。
如果您只想嵌入 PDF 对象,可以尝试使用 PDFobject.js。
https://github.com/pipwerks/PDFObject
http://pdfobject.com/instructions.php
HTML
<div id="my_pdf_object"
class="pdf"
webkitallowfullscreen=""
mozallowfullscreen=""
allowfullscreen=""
frameborder="no"
width="'.$width.'"
height="'.$height.'"
>
It appears you don't have Adobe Reader or PDF support in this web browser.
<a href="'.$baseurl.'/assets/pdf/web/viewer.html file='.urlencode($pdf_url).'">
Click here to download the PDF</a>
</div>
JavaScript
<script type="text/javascript">
//loads pdf files for resume
window.onload = function (){
var success = new PDFObject({
url: "'.$baseurl.'/assets/pdf/web/viewer.html?file='.urlencode($pdf_url).'"
}).embed("my_pdf_object");
};
</script>
我建议您使用 php 删除文件扩展名,然后使用viewer.html?file=file_path&name
来查看 pdf 而不会从 idm 拦截:
$fileinfo = pathinfo($book['file']);
$path_pdf=$fileInfo['dirname'];
$name_pdf=$fileInfo['filename'];
header('location: viewer.html?file='.$path_pdf.'/'.$name_pdf.'');
如何防止 IDM 等下载管理器从服务器下载 pdf 文件
不要向 pdf-viewer 提供直接文件路径,例如path/to/pdf-file.pdf
。 在您的服务器上创建一个为该文件提供服务的路由。
http://example.com / d-file.php? 文件名=一些文件
通过这种方式,您可以更好地控制如何以及何时提供此文件。 此外,在 html 源代码中查找以指定扩展名 (like.pdf) 结尾的文件的下载管理器将无法找到此链接。
使用 session 阻止对文件路由的多个请求。
这些 dms 寻找被浏览器触发的 ajax 请求。 pdf-viewer 将首先发出这个 ajax 请求以从服务器加载 pdf 文件。 在那之后,下载管理器将模仿这个请求并下载文件。 我们可以利用 session 来阻止它。
在具有 pdf-viewer 的页面上,我们将使用随机生成的字符串设置 session 密钥,并将其作为查询参数附加到文件路径。 收到 pdf 文件请求后,我们将验证令牌并将其从 session 取消设置并提供文件。 当下一个请求进来时,我们将不再拥有 session 密钥,因此我们阻止了该请求。 session 密钥只能在用户重新加载具有 pdf-viewer 的页面时重置。
只需通过替换<iframe />
来使用<embed />
> 来防止自动下载
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.