如何防止浏览器选项卡创建传递 PDF 文件?

问题描述 投票:0回答:1

我有一个网站,登录后,人们可以下载个性化的 PDF 文档。有一个具体问题,我在 StackOverflow 上尚未找到解决方案或讨论。

首先,我使用此功能发送文档(发送预标题):

function _outputContent(&$fileEntry) {
  // return $fileEntry content (decrypted PDF file)!
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Cache-Control: private",false);
  header("Accept-Ranges: bytes");
  header("Pragma: public");
  header('Expires: 0');
  header("Content-Description: File Transfer");
  header("Content-Type: application/pdf");
  header("Content-Disposition: attachment; filename=\"".$fileEntry["name"]."\"");
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: " . strlen($fileEntry["decrypted"]));

  echo $fileEntry["decrypted"];
}

问题是,主要在移动设备上,取决于网络浏览器、首选项和设置,如果网络浏览器直接显示 PDF,这会在最终用户网络浏览器中打开一个新选项卡。如果用户稍后关闭网络浏览器并在几个小时后打开它,某些网络浏览器会尝试恢复所有以前打开的选项卡并触发这些选项卡的无效下载请求。最多的请求是来自单个设备的 3 秒内 56 个请求。遗憾的是,这会触发 mod_evasive 和我们针对 DOS 攻击实施的另一个安全工具。

有没有办法传送 PDF,以便新创建的选项卡中不再有下载 URL?

我尝试了其他 Content-Type 值,例如 application/octet-stream,但这会给希望直接打开 PDF 的最终用户带来问题。有些人稍后似乎无法打开下载的文件。所以最好立即显示 PDF。或者我可以阻止网络浏览器创建新选项卡吗?

php download content-type
1个回答
0
投票

我们遇到了几乎类似的问题(对于 csv 文件,但几乎相同)。 我们找到了一个“解决方案”(我认为不是最好的解决方案,但对我们有用)。 我们通过ajax请求发送数据内容,然后在JS中创建文件。此解决方案使用客户端资源。

这是 csv 文件的示例

function downloadCSV(data, filename) {
// create Blob object
    var BOM = new Uint8Array([0xEF, 0xBB, 0xBF]);
    var blob = new Blob([BOM, data], {type: 'text/csv;charset=utf-8;'});
    // Create dom
    var link = document.createElement('a');
    // Set filename
    link.download = filename;
    link.href = window.URL.createObjectURL(blob);
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

希望这能有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.