Ich möchte den Browser zwingen, eine pdf
Datei herunterzuladen .
Ich verwende den folgenden Code:
<a href="../doc/quot.pdf" target=_blank>Click here to Download quotation</a>
Dadurch öffnet der Browser das PDF in einem neuen Fenster, aber ich möchte, dass es auf die Festplatte heruntergeladen wird, wenn ein Benutzer darauf klickt.
Ich habe festgestellt, dass Content-disposition
dies verwendet wird, aber wie verwende ich es in meinem Fall?
Antworten:
Stellen Sie in der HTTP-Antwort, in der Sie die PDF-Datei zurückgeben, sicher, dass der Header für die Inhaltsdisposition wie folgt aussieht:
Content-Disposition: attachment; filename=quot.pdf;
Siehe Inhaltsdisposition auf der Wikipedia MIME-Seite.
quelle
In neueren Browsern können Sie auch das HTML5-Download-Attribut verwenden:
<a download="quot.pdf" href="../doc/quot.pdf">Click here to Download quotation</a>
Es wird von den meisten aktuellen Browsern mit Ausnahme von MSIE11 unterstützt. Sie können eine Polyfüllung verwenden, etwa so (beachten Sie, dass dies nur für Daten-Uri gilt, dies ist jedoch ein guter Anfang):
(function (){ addEvent(window, "load", function (){ if (isInternetExplorer()) polyfillDataUriDownload(); }); function polyfillDataUriDownload(){ var links = document.querySelectorAll('a[download], area[download]'); for (var index = 0, length = links.length; index<length; ++index) { (function (link){ var dataUri = link.getAttribute("href"); var fileName = link.getAttribute("download"); if (dataUri.slice(0,5) != "data:") throw new Error("The XHR part is not implemented here."); addEvent(link, "click", function (event){ cancelEvent(event); try { var dataBlob = dataUriToBlob(dataUri); forceBlobDownload(dataBlob, fileName); } catch (e) { alert(e) } }); })(links[index]); } } function forceBlobDownload(dataBlob, fileName){ window.navigator.msSaveBlob(dataBlob, fileName); } function dataUriToBlob(dataUri) { if (!(/base64/).test(dataUri)) throw new Error("Supports only base64 encoding."); var parts = dataUri.split(/[:;,]/), type = parts[1], binData = atob(parts.pop()), mx = binData.length, uiArr = new Uint8Array(mx); for(var i = 0; i<mx; ++i) uiArr[i] = binData.charCodeAt(i); return new Blob([uiArr], {type: type}); } function addEvent(subject, type, listener){ if (window.addEventListener) subject.addEventListener(type, listener, false); else if (window.attachEvent) subject.attachEvent("on" + type, listener); } function cancelEvent(event){ if (event.preventDefault) event.preventDefault(); else event.returnValue = false; } function isInternetExplorer(){ return /*@cc_on!@*/false || !!document.documentMode; } })();
quelle