繁体   English   中英

Safari 12 不会下载 PDF blob

[英]Safari 12 Won't Download a PDF blob

此代码用于通过 blob 下载 pdf。 它适用于除 macOS 和 iOS 的 Safari 12 之外的所有浏览器。 甚至 Safari 11 也能工作。 当我第一次运行代码时,它工作正常,但之后每次都会给我“WebKitBlobResource 错误 1”

 function downloadFileFromBlob(fileBlob, fileName) { if (/\\bMSIE\\b|\\bTrident\\b/.test($window.navigator.userAgent)) { $window.navigator.msSaveOrOpenBlob(fileBlob, fileName); } else { var fileURL = $window.URL.createObjectURL(fileBlob); createDownloadElementAndClick(fileURL, fileName); } } function createDownloadElementAndClick(fileURL, fileName) { var anchorElement = $window.document.createElement('a'); anchorElement.href = fileURL; anchorElement.target = '_blank'; anchorElement.download = fileName; var event = $window.document.createEvent("MouseEvents"); event.initEvent("click", true, false); anchorElement.dispatchEvent(event); }

似乎是target = "_blank"不起作用。 我已经用_self替换了它,这显然解决了这个问题。 当我遇到同样的问题时,我发现了这一点。

如果有人知道为什么我们不能使用_blank我很乐意听到。

显然,这是有时会发生的Safari 12 错误 它不是由target = "_self"修复的,它与不同的回归错误有关

在错误修复之前,丑陋的解决方法是:

  1. 将 blob 发送到远程保存文件的服务器。
  2. 下载远程文件。

Javascript代码

   async createDownloadElementAndClick(blob, fileName) {
            let options = {
                method:"POST",
                body:blob
            };

            await fetch(`https://example.com/upload.php`, options);

            window.open(`https://example.com/download.php?${fileName}`, "_self");
    }

PHP代码

在upload.php中:

<?php    
// add any authentication code as necessary here


    // gets entire POST body
    $data = file_get_contents('php://input');

    $filename = "temp/download.pdf";
    // write the data out to the file
    $fp = fopen($filename, 'wb');

    fwrite($fp, $data);
    fclose($fp);
?>

在下载.php中:

<?php
    ob_start();
    $file = $_SERVER["QUERY_STRING"];

    // This is the line that tells Safari to download the file instead of opening it
    header("Content-disposition: attachment; filename=$file");
    header("Content-type: application/pdf", false);
    readfile("temp/download.pdf");

    ob_flush();
    // This deletes the pdf so there is little chance of contaminating the next call
    unlink("temp/download.pdf");
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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