Safari 12 не будет загружать PDF-файлы - PullRequest
0 голосов
/ 29 октября 2018

Этот код используется для загрузки PDF через блоб. Он отлично работает в любом браузере, кроме Safari 12 для MacOS и iOS. Даже Safari 11 работает. Когда я запускаю код в первый раз, он работает нормально, но каждый раз после этого он выдает мне «WebKitBlobResource error 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);
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Очевидно, это ошибка Safari 12 , которая иногда происходит. Это не исправлено target = "_self", что относится к другой ошибке регрессии .

Пока ошибка не исправлена, уродливый обходной путь:

  1. Отправка большого двоичного объекта на сервер, который сохраняет файл удаленно.
  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

In 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");
?>
0 голосов
/ 16 ноября 2018

Кажется, что target = "_blank" не работает. Я заменил его на _self, что, видимо, решило проблему. Я нашел это, когда у меня была та же проблема.

Если у кого-то есть идея, почему мы не можем использовать _blank, я бы с удовольствием это услышал.

...