Ce code est utilisé pour télécharger un pdf via blob. Cela fonctionne bien sur tous les navigateurs, à l'exception de Safari 12 pour macOS et iOS. Même Safari 11 fonctionne. Lorsque j'exécute le code la toute première fois, cela fonctionne très bien, mais à chaque fois, cela me donne "Erreur 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);
}
Apparemment, c'est un bug de Safari 12 qui parfois se produit. Ce n'est pas résolu par target = "_self"
, qui appartient à un bogue de régression différent .
Jusqu'à ce que le bogue soit corrigé, la solution de contournement laide est:
Code 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");
}
Code PHP
Dans 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);
?>
Dans 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");
?>
Il semble que ce soit le target = "_blank"
qui ne fonctionne pas. Je l'ai remplacé par _self
, ce qui a apparemment résolu le problème. J'ai trouvé cela quand j'ai eu le même problème.
Si quelqu'un a une idée des raisons pour lesquelles nous ne pouvons pas utiliser _blank
J'aimerais bien l'entendre.