このコードは、blob経由でpdfをダウンロードするために使用されます。 macOSおよびiOS用のSafari 12を除くすべてのブラウザーで正常に動作します。 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);
}
どうやらこれは Safari 12のバグ である時々が起こる。 異なる回帰バグ に関係するtarget = "_self"
では修正されません。
バグが修正されるまで、い回避策は次のとおりです。
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");
?>
target = "_blank"
が機能していないようです。私はそれを_self
に置き換え、明らかに問題を解決しました。私は同じ問題を抱えていたときにこれを見つけました。
誰かが_blank
を使用できない理由を知っているなら、それを聞きたいです。