webentwicklung-frage-antwort-db.com.de

Safari 12 wird keinen PDF blob herunterladen

Dieser Code wird verwendet, um ein PDF per Blob herunterzuladen. Mit Ausnahme von Safari 12 für MacOS und iOS funktioniert es in allen Browsern einwandfrei. Auch Safari 11 funktioniert. Wenn ich den Code zum ersten Mal ausführe, funktioniert er einwandfrei. Danach erhalte ich jedoch jedes Mal die Meldung "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);
}
7
Daniel Baughman

Anscheinend ist dies ein Safari 12-Fehler , der manchmal passiert. Es ist nicht durch target = "_self" Behoben, was sich auf einen anderen Regressionsfehler bezieht.

Bis der Fehler behoben ist, lautet die hässliche Problemumgehung:

  1. Senden Sie den Blob an den Server, der die Datei remote speichert.
  2. Laden Sie die Remote-Datei herunter.

Javascript Code

   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 Code

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

In der 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");
?>
4
chatnoir

Es scheint, dass es der target = "_blank" Ist, der nicht funktioniert. Ich habe es durch _self Ersetzt, was anscheinend das Problem gelöst hat. Ich fand das, als ich das gleiche Problem hatte.

Wenn jemand eine Idee hat, warum wir _blank Nicht verwenden können, würde ich das gerne hören.

3