繁体   English   中英

防止 idm 使用 pdf.js 自动下载 PDF

[英]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 ,文件将立即在浏览器窗口中查看。

可能的解决方案 :

  1. 从 IDM 中删除 PDF 扩展处理程序,以防止自动下载,我认为图像很好地解释了它。

IDM 阻止处理文件类型

  1. 修改您的 PDF 链接的响应标头以强制您的浏览器在其视图中查看 pdf,请考虑每个浏览器可能会以不同的方式处理响应,有关此方法的更多详细信息可以在这里找到。

最后注:

作为开发人员,您不应该处理每个用户特定的环境,我们假设当用户安装特定应用程序来处理通用文件时,处理该应用程序是他/她的角色,而不是开发人员角色,因为如果您遵循此算法,您跳入无限循环处理不同用户的特定设置。

只需从主文件中删除.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 文件

  1. 不要向 pdf-viewer 提供直接文件路径,例如path/to/pdf-file.pdf 在您的服务器上创建一个为该文件提供服务的路由。

    http://example.com / d-file.php? 文件名=一些文件

    通过这种方式,您可以更好地控制如何以及何时提供此文件。 此外,在 html 源代码中查找以指定扩展名 (like.pdf) 结尾的文件的下载管理器将无法找到此链接。

  2. 使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM