无法在Mac上从Safari 12.1保存Blob网址pdf

时间:2019-04-13 13:17:27

标签: javascript html safari

我正在将iframe src设置为格式为“ blob:http://localhost:3000/f87808a3-9a74-4d61-b7ae-7ac37ff38325”的Blob网址。 iframe会显示使用某些javascript创建的pdf。在所有浏览器中都能正常显示pdf。在Chrome和Firefox中,可以使用集成了浏览器的pdf查看器将此pdf下载到硬盘驱动器。

但是,在Mac上的Safari 12.1中,单击pdf查看器的下载按钮时,没有任何反应。

这是Safari中的已知错误吗?

有没有办法使Safari上的pdf blob网址下载正常工作?

1 个答案:

答案 0 :(得分:0)

这与我的答案here有关。

显然,这是{em>有时发生的Safari 12.1 bugtarget = "_self"并不固定,它与different regression bug有关。

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

  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);
?>

在download.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");
?>