Datei mit Javascript / jQuery herunterladen

357

Ich habe eine sehr ähnliche Anforderung hier angegeben .

Ich muss den Browser des Benutzers manuell starten lassen, wenn $('a#someID').click();

Ich kann die window.hrefMethode jedoch nicht verwenden , da sie den aktuellen Seiteninhalt durch die Datei ersetzt, die Sie herunterladen möchten.

Stattdessen möchte ich den Download in einem neuen Fenster / Tab öffnen. Wie ist das möglich?

Mithun Sreedharan
quelle
Ich habe viele Antworten in verwandten Fragen ausprobiert, und dies ist die endgültige Antwort .
Basj
Das Einstellen von window.location.href funktioniert bei mir. Auch der Fensterinhalt ändert sich NICHT. Ich nehme an, Sie haben den falschen Inhaltstyp verwendet?
BluE

Antworten:

379

Verwenden Sie ein unsichtbares <iframe>:

<iframe id="my_iframe" style="display:none;"></iframe>
<script>
function Download(url) {
    document.getElementById('my_iframe').src = url;
};
</script>

Um den Browser zum Herunterladen einer Datei zu zwingen, die er sonst rendern könnte (z. B. HTML- oder Textdateien), muss der Server den MIME-Typ der Datei auf einen unsinnigen Wert festlegen , z. B. application/x-please-download-meoder alternativ application/octet-stream, der für eine beliebige Binärdatei verwendet wird Daten.

Wenn Sie es nur in einer neuen Registerkarte öffnen möchten, können Sie dies nur tun, indem Sie auf einen Link klicken, dessen targetAttribut auf gesetzt ist _blank.

In jQuery:

$('a#someID').attr({target: '_blank', 
                    href  : 'http://localhost/directory/file.pdf'});

Wenn Sie auf diesen Link klicken, wird die Datei in einem neuen Tab / Fenster heruntergeladen.

Randy der Entwickler
quelle
4
Eine Webseite kann einen neuen Tab nicht automatisch öffnen. Um den Browser zum Herunterladen zu zwingen, veranlassen Sie den Server, die PDF-Datei mit einem unsinnigen MIME-Typ zu senden, z. B. application / x-please-download-me
Randy the Dev
14
Schön gemacht! Löst das Problem gut. Möglicherweise möchten Sie jedoch Folgendes verwenden: Dadurch iframe.style.display = 'none'; wird der Iframe vollständig ausgeblendet. Ihre aktuelle Implementierung macht den Iframe unsichtbar, aber der Iframe nimmt weiterhin Platz am unteren Rand der Seite ein und verursacht zusätzlichen Leerraum.
Akrikos
2
Es funktioniert "semi" für mich. Ich habe das folgende einfache Test-HTML erstellt: <html> <body> <iframe src = "fileurl"> </ iframe> </ body> </ html> und es wird heruntergeladen, aber in der Chrome-Konsole sehe ich, dass der Download wurde "abgesagt" und erscheint in rot. Dies ist Teil einer größeren mobilen Web-App, und die Tatsache, dass sie abgebrochen wird, bricht die App, da sie einen allgemeinen Webfehler auslöst. Wie kann man das umgehen?
Sagi Mann
27
Schöner Ausschnitt. Das Einstellen eines unsinnigen Dings-Typs ist jedoch etwas störend. Verwenden Sie den folgenden Header, um den Browser aufzufordern, eine Datei herunterzuladen, die er rendern kann: Content-Disposition: attachment; filename="downloaded.pdf"(Sie können den Dateinamen natürlich nach Bedarf anpassen).
Rixo
2
Wie erzwinge ich den Download ohne Server? Also nur eine HTML-Seite mit etwas Javascript.
Rodrigo Ruiz
221

2019 Update moderner Browser

Dies ist der Ansatz, den ich jetzt mit ein paar Einschränkungen empfehlen würde:

  • Ein relativ moderner Browser ist erforderlich
  • Wenn erwartet wird, dass die Datei sehr groß ist , sollten Sie wahrscheinlich etwas Ähnliches wie beim ursprünglichen Ansatz (Iframe und Cookie) tun, da einige der folgenden Vorgänge wahrscheinlich Systemspeicher verbrauchen könnten, der mindestens so groß ist wie die heruntergeladene Datei und / oder eine andere interessante CPU Nebenwirkungen.

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.blob())
  .then(blob => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    // the filename you want
    a.download = 'todo-1.json';
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    alert('your file has downloaded!'); // or you know, something with better UX...
  })
  .catch(() => alert('oh no!'));

2012 ursprünglicher jQuery / iframe / cookie-basierter Ansatz

Ich habe das jQuery File Download Plugin ( Demo ) ( GitHub ) erstellt, das auch in Ihrer Situation helfen kann. Es funktioniert ziemlich ähnlich mit einem Iframe, hat aber einige coole Funktionen, die ich als sehr praktisch empfunden habe:

  • Sehr einfach mit netter Grafik einzurichten (jQuery UI Dialog, aber nicht erforderlich), alles wird auch getestet

  • Der Benutzer verlässt niemals dieselbe Seite, von der er einen Dateidownload initiiert hat. Diese Funktion wird für moderne Webanwendungen immer wichtiger

  • Mit den Funktionen successCallback und failCallback können Sie explizit angeben, was der Benutzer in beiden Situationen sieht

  • In Verbindung mit der jQuery-Benutzeroberfläche kann ein Entwickler dem Benutzer auf einfache Weise ein Modal anzeigen, das angibt, dass ein Dateidownload stattfindet, das Modal nach dem Start des Downloads auflösen oder den Benutzer sogar freundlich darüber informieren, dass ein Fehler aufgetreten ist. Ein Beispiel hierfür finden Sie in der Demo . Hoffe das hilft jemandem!

Hier ist eine einfache Anwendungsfall-Demo unter Verwendung der Plugin- Quelle mit Versprechungen. Die Demoseite enthält auch viele andere, bessere UX-Beispiele.

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });
John Culviner
quelle
@ JohnCulviner: Kann ich JSON-Daten in Ihrer Post-Methode senden? Ich habe es ausprobiert und bin gescheitert. Können Sie mir Probe geben
Saravanan
Ist es möglich, Parameter an den Aufruf zu übergeben? Angenommen, ich muss einige IDs übergeben, damit der Server die Datei generiert, die ich herunterladen möchte. Wie kann ich das tun? danke
omer schleifer
Habe die 100. Upvote gemacht. Vielen Dank für Ihre Zeit - das ist wirklich wertvoll. Erwägen Sie, einen PayPal-Link für Spenden einzurichten. Ich hätte gespendet.
Stephan Schinkel
Ich habe es versucht, aber die Rückrufe werden nie ausgeführt. Das Plug-In öffnet nur die Dienstantwort in einer neuen Registerkarte, selbst wenn der Dienst einen Fehler zurückgibt. Ich möchte nicht, dass die Anwendung eine neue Registerkarte öffnet und die Serviceantwort anzeigt, wenn ein Fehler ausgegeben wird. Ich habe sogar das Cookie hinzugefügt, um anzuzeigen, dass die Datei bei Erfolg und Misserfolg richtig und falsch heruntergeladen wurde, aber die Antwort wird immer noch in einem neuen Tab geöffnet. Wie auch immer, um dies zu beheben. Ich verwende die Methode get.
Vishal Gulati
1
@ MarkAmery, die auch funktioniert, wie andere Antworten angegeben haben. Dieser Ansatz (AFAIK) gibt Ihnen kein Feedback darüber, wann der Download beginnt, wann er abgeschlossen ist und ob ein Fehler aufgetreten ist, was praktisch ist. Ich könnte das zur Antwort für eine Option "Feuer und Vergessen" hinzufügen. Das Attribut [download] erlaubt auch keinen POST oder etwas Exotisches.
John Culviner
142
function downloadURI(uri, name) 
{
    var link = document.createElement("a");
    // If you don't know the name or want to use
    // the webserver default set name = ''
    link.setAttribute('download', name);
    link.href = uri;
    document.body.appendChild(link);
    link.click();
    link.remove();
}

Überprüfen Sie, ob Ihre Zielbrowser das obige Snippet reibungslos ausführen:
http://caniuse.com/#feat=download

Stellen Sie sich Breaker vor
quelle
1
Download Dateiname hat sich nicht geändert ... getestet in Chrom im April 2015
Novellizator
7
Für mich wäre das perfekt, aber es funktioniert auch nicht mit Firefox. Irgendeine Idee?
g07kore
2
Wie unter caniuse.com/#feat=download erwähnt, funktioniert dies nur für Links gleichen Ursprungs in aktuellen Firefox- und Chrome-Versionen. Wenn Ihre Links also auf eine andere Domain verweisen, funktioniert dies vorerst nirgendwo.
Jean-Baptiste
9
Damit es unter Firefox funktioniert, müssen Sie dies document.body.appendChild(link)vor dem Klicken und nach dem Klicken tun link.remove(), um eine Verschmutzung des DOM zu vermeiden.
Okku
1
Sie können auch dafür sorgen link.download = "", dass der ursprüngliche Dateiname beibehalten wird und Sie keinen festlegen müssen.
Okku
69

Ich bin überrascht, dass nicht viele Leute über das Download-Attribut für ein Element Bescheid wissen. Bitte helfen Sie mit, das Wort darüber zu verbreiten! Sie können einen versteckten HTML-Link haben und einen Klick darauf fälschen. Wenn der HTML-Link das Download-Attribut hat, lädt er die Datei herunter und zeigt sie nicht an, egal was passiert. Hier ist der Code. Es wird ein Katzenbild heruntergeladen, wenn es es finden kann.

document.getElementById('download').click();
<a href="https://docs.google.com/uc?id=0B0jH18Lft7ypSmRjdWg1c082Y2M" download id="download" hidden></a>

Hinweis: Dies wird nicht in allen Browsern unterstützt: http://www.w3schools.com/tags/att_a_download.asp

Hilfreiche 13 Jahre alt
quelle
12
Nicht unterstützt in IE und Safari
MatPag
9
Chrome wird heruntergeladen, aber Firefox zeigt nur das Bild.
Saran
+1 für die Bereitstellung dieses ausführbaren Snippets. Ich habe mir die Zeit gespart, es nur zu testen, um herauszufinden, dass es nicht funktioniert.
Doopy
4
Das neueste Chrome (August 2018) zeigt auch ein Bild (aufgrund einer absurden Sicherheitsbeschränkung), also scheitern Sie
user1156544
Chrome wird nicht für mp4s heruntergeladen
Nearoo
53

Ich empfehle, das downloadAttribut anstelle von jQuery zum Herunterladen zu verwenden:

<a href="your_link" download> file_name </a>

Dadurch wird Ihre Datei heruntergeladen, ohne sie zu öffnen.

Laura Chesches
quelle
5
Es wird nur Chrome, Firefox, Opera und IE (> = 13.0) unterstützen
Kunal Kakkad
Kante> = 13, nicht IE. Auch die Edge 13-Implementierungen sind fehlerhaft, da der Name der Datei ignoriert wird und stattdessen eine Datei mit einer ID als Name angezeigt wird.
David
8
Meiner Meinung nach ist dies die richtige Antwort auf die Frage. Die anderen Antworten sind sinnvoll, wenn Sie ältere Browser unterstützen müssen und eine Problemumgehung benötigen.
CrabCRUSHERclamCOLLECTOR
19

Wenn Sie jQuery bereits verwenden, können Sie es nutzen, um ein kleineres Snippet zu erstellen.
Eine jQuery-Version von Andrews Antwort:

var $idown;  // Keep it outside of the function, so it's initialized once.
downloadURL : function(url) {
  if ($idown) {
    $idown.attr('src',url);
  } else {
    $idown = $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
  }
},
//... How to use it:
downloadURL('http://whatever.com/file.pdf');
corbacho
quelle
Zu Ihrer Information, jemand schlug vor (über das Bearbeiten meines Beitrags), $ idown.attr ('src', url) hinzuzufügen; nach dem ersten Erstellen des Iframes. Ich glaube nicht, dass es nötig ist. Es setzt bereits im Erstellungsschritt die 'src: url'.
Corbacho
Um auch zu kommentieren, dass ich diese Lösung schließlich nicht verwendet habe, weil IE 9 dynamisch erstellte Iframes nicht mochte, die auf http: // verweisen, wenn Sie sich in einem https-Web befinden. Ich musste "window.location.href" verwenden, eine Lösung, die auch einige Unannehmlichkeiten hat
Corbacho
Der Teil "if ($ idown)" hat in der neuesten Version von Chrome (24) nicht funktioniert, sondern nur eine endlose Anzahl von Iframes erstellt. Vielleicht, weil ich 12 Dinge gleichzeitig herunterladen wollte?
Nessur
6
Die ifAussage sollte wirklich sein:if( $idown && $idown.length > 0 )
iOnline247
3
Tut nichts in Chrome
jjxtra
11

Funktioniert unter Chrome, Firefox und IE8 und höher.

var link=document.createElement('a');
document.body.appendChild(link);
link.href=url ;
link.click();
EL missaoui habib
quelle
Dies funktioniert auch, wenn Sie den Link nicht an das DOM anhängen.
Johnie Karr
Sofern vom Server zurückgegebene Header nichts anderes angeben, wird lediglich zu navigiert urlund nicht von diesem heruntergeladen.
Mark Amery
10

Einfaches Beispiel mit einem iframe

function downloadURL(url) {
    var hiddenIFrameID = 'hiddenDownloader',
        iframe = document.getElementById(hiddenIFrameID);
    if (iframe === null) {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }
    iframe.src = url;
};

Rufen Sie dann einfach die Funktion auf, wo immer Sie möchten:

downloadURL('path/to/my/file');

Aaron Lelevier
quelle
10

Dies kann hilfreich sein, wenn Sie nicht auf einer anderen Seite navigieren müssen. Dies ist eine Basis-Javascript-Funktion, die auf jeder Plattform verwendet werden kann, auf der sich das Backend in Javascript befindet

window.location.assign('any url or file path')
Rohit Parte
quelle
Dies ist wahrscheinlich die einfachste Lösung, wenn Sie den contentType selbst festlegen können. Ich benutze es als: window.location.href = downloadFileUrl;
BluE
Wenn der Administrator dem Benutzer die URL nicht anzeigen möchte als?
Naren Verma
9

Nur sieben Jahre später kommt hier eine einzeilige jQuery-Lösung, die ein Formular anstelle eines Iframes oder Links verwendet:

$('<form></form>')
     .attr('action', filePath)
     .appendTo('body').submit().remove();

Ich habe das in getestet

  • Chrome 55
  • Firefox 50
  • Edge IE8-10
  • iOS 10 (Safari / Chrome)
  • Android Chrome

Wenn jemand Nachteile dieser Lösung kennt, würde ich mich sehr freuen, davon zu hören.


Vollständige Demo:

<html>
<head><script src="https://code.jquery.com/jquery-1.11.3.js"></script></head>
<body>
<script>
    var filePath = window.prompt("Enter a file URL","http://jqueryui.com/resources/download/jquery-ui-1.12.1.zip");
    $('<form></form>').attr('action', filePath).appendTo('body').submit().remove();
</script>
</body>
</html>
Rakaloof
quelle
7
Dies funktioniert nicht, wenn Sie filePatheinen Querystring haben, da beim Senden eines Formulars der Querystring im Aktionsattribut überschrieben wird.
Bobort
1
Ich habe dies umgangen, indem ich dem Formular eine Eingabe hinzugefügt habe: var authInput = $("<input>").attr("type", "hidden").attr("name", "myQsKey").val('MyQsValue'); $('<form></form>') .attr('action', filePath) .append($(authInput)) .appendTo('body').submit().remove();Dies ist eine äquivalente Antwort:filepath?myQsKey=myValue
Harald Hoerwick
Dadurch werden auch die Websockets geschlossen.
Radu122
2
Dies scheint eine wirklich komplizierte Art window.locationzu sein filePath. Nur window.location = filePath;würde das gleiche tun.
Ivo Smits
Unabhängig davon, ob diese Lösung per se einen Nachteil hat , haben Sie keinen Vorteil für die Verwendung über einen Link bereitgestellt . (Und es gibt einen Nachteil: Sie können das downloadAttribut nicht auf diese Weise verwenden, um dem Browser mitzuteilen, dass Sie einen Download wünschen, unabhängig davon, welche Header der Server zurückgibt, was Sie mit einem aElement tun können .)
Mark Amery
5

Ich weiß nicht, ob die Frage einfach zu alt ist, aber das Festlegen von window.location auf eine Download-URL funktioniert, solange der Download-MIME-Typ korrekt ist (z. B. ein Zip-Archiv).

var download = function(downloadURL) {

   location = downloadURL;

});

download('http://example.com/archive.zip'); //correct usage
download('http://example.com/page.html'); //DON'T
Maciej Krawczyk
quelle
5

Am Ende habe ich das folgende Snippet verwendet und es funktioniert in den meisten Browsern, allerdings nicht im IE getestet.

let data = JSON.stringify([{email: "[email protected]", name: "test"}, {email: "[email protected]", name: "anothertest"}]);

let type = "application/json", name = "testfile.json";
downloader(data, type, name)

function downloader(data, type, name) {
	let blob = new Blob([data], {type});
	let url = window.URL.createObjectURL(blob);
	downloadURI(url, name);
	window.URL.revokeObjectURL(url);
}

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}

Aktualisieren

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}

function downloader(data, type, name) {
    let blob = new Blob([data], {type});
    let url = window.URL.createObjectURL(blob);
    downloadURI(url, name);
    window.URL.revokeObjectURL(url);
}
Abk
quelle
Was bringt es, MouseEventhier zu verwenden, anstatt immer zu verwenden click? Und warum den Link an das Dokument anhängen, bevor Sie darauf klicken? Vielleicht hat dies Vorteile gegenüber dem einfacheren Ansatz, der in stackoverflow.com/a/23013574/1709587 gezeigt wird , aber wenn ja, werden sie hier nicht erklärt.
Mark Amery
Es ist schon eine Weile her, dass ich diese Antwort gepostet habe. Ich kann mich nicht erinnern, ob es einen Grund für diese unnötigen Codezeilen gibt.
Abk
3

Um die Antwort von Imagine Breaker zu verbessern, wird dies von FF & IE unterstützt:

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);

function downloadURI(uri, name) {
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.dispatchEvent(evt);
}

Mit anderen Worten, verwenden Sie einfach eine dispatchEventFunktion anstelle von click();

La Masse
quelle
Wie ist das eine Verbesserung? Es scheint einfach eine kompliziertere Art zu sein, dasselbe zu tun.
Mark Amery
3

Lassen Sie Ihr Javascript möglicherweise nur eine Seite öffnen, auf der nur eine Datei heruntergeladen wird, z. B. wenn Sie einen Download-Link auf einen neuen Tab ziehen:

Window.open("https://www.MyServer.
Org/downloads/ardiuno/WgiWho=?:8080")

Öffnen Sie bei geöffnetem Fenster eine Download-Seite, die automatisch geschlossen wird.

Brian Waltse
quelle
1
Dies schafft ein Popup-Fenster, das die meisten Browser blockieren
Ashton Wiersdorf
3

Es folgt der vollständigste und funktionsfähigste (getestete) Code zum Herunterladen von Daten für FireFox-, Chrome- und IE-Code. Angenommen, die Daten befinden sich im Texarea- Feld mit der ID = 'textarea_area' und der Dateiname ist der Name der Datei, in die die Daten heruntergeladen werden.

function download(filename) {
    if (typeof filename==='undefined') filename = ""; // default
    value = document.getElementById('textarea_area').value;

    filetype="text/*";
    extension=filename.substring(filename.lastIndexOf("."));
    for (var i = 0; i < extToMIME.length; i++) {
        if (extToMIME[i][0].localeCompare(extension)==0) {
            filetype=extToMIME[i][1];
            break;
        }
    }


    var pom = document.createElement('a');
    pom.setAttribute('href', 'data: '+filetype+';charset=utf-8,' + '\ufeff' + encodeURIComponent(value)); // Added BOM too
    pom.setAttribute('download', filename);


    if (document.createEvent) {
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { // IE
            blobObject = new Blob(['\ufeff'+value]);
            window.navigator.msSaveBlob(blobObject, filename);
        } else { // FF, Chrome
            var event = document.createEvent('MouseEvents');
            event.initEvent('click', true, true);
            pom.dispatchEvent(event);
        }
    } else if( document.createEventObject ) { // Have No Idea
        var evObj = document.createEventObject();
        pom.fireEvent( 'onclick' , evObj );
    } else { // For Any Case
        pom.click();
    }

}

und dann einfach anrufen

<a href="javascript:download();">Download</a>

Zum Herunterladen initiieren.

Das Array zum Einstellen des richtigen MIME-Typs für den Download-Dialog kann wie folgt sein:

// ----------------------- Extensions to MIME --------- //

        // List of mime types
        // combination of values from Windows 7 Registry and 
        // from C:\Windows\System32\inetsrv\config\applicationHost.config
        // some added, including .7z and .dat
    var extToMIME = [
        [".323", "text/h323"],
        [".3g2", "video/3gpp2"],
        [".3gp", "video/3gpp"],
        [".3gp2", "video/3gpp2"],
        [".3gpp", "video/3gpp"],
        [".7z", "application/x-7z-compressed"],
        [".aa", "audio/audible"],
        [".AAC", "audio/aac"],
        [".aaf", "application/octet-stream"],
        [".aax", "audio/vnd.audible.aax"],
        [".ac3", "audio/ac3"],
        [".aca", "application/octet-stream"],
        [".accda", "application/msaccess.addin"],
        [".accdb", "application/msaccess"],
        [".accdc", "application/msaccess.cab"],
        [".accde", "application/msaccess"],
        [".accdr", "application/msaccess.runtime"],
        [".accdt", "application/msaccess"],
        [".accdw", "application/msaccess.webapplication"],
        [".accft", "application/msaccess.ftemplate"],
        [".acx", "application/internet-property-stream"],
        [".AddIn", "text/xml"],
        [".ade", "application/msaccess"],
        [".adobebridge", "application/x-bridge-url"],
        [".adp", "application/msaccess"],
        [".ADT", "audio/vnd.dlna.adts"],
        [".ADTS", "audio/aac"],
        [".afm", "application/octet-stream"],
        [".ai", "application/postscript"],
        [".aif", "audio/x-aiff"],
        [".aifc", "audio/aiff"],
        [".aiff", "audio/aiff"],
        [".air", "application/vnd.adobe.air-application-installer-package+zip"],
        [".amc", "application/x-mpeg"],
        [".application", "application/x-ms-application"],
        [".art", "image/x-jg"],
        [".asa", "application/xml"],
        [".asax", "application/xml"],
        [".ascx", "application/xml"],
        [".asd", "application/octet-stream"],
        [".asf", "video/x-ms-asf"],
        [".ashx", "application/xml"],
        [".asi", "application/octet-stream"],
        [".asm", "text/plain"],
        [".asmx", "application/xml"],
        [".aspx", "application/xml"],
        [".asr", "video/x-ms-asf"],
        [".asx", "video/x-ms-asf"],
        [".atom", "application/atom+xml"],
        [".au", "audio/basic"],
        [".avi", "video/x-msvideo"],
        [".axs", "application/olescript"],
        [".bas", "text/plain"],
        [".bcpio", "application/x-bcpio"],
        [".bin", "application/octet-stream"],
        [".bmp", "image/bmp"],
        [".c", "text/plain"],
        [".cab", "application/octet-stream"],
        [".caf", "audio/x-caf"],
        [".calx", "application/vnd.ms-office.calx"],
        [".cat", "application/vnd.ms-pki.seccat"],
        [".cc", "text/plain"],
        [".cd", "text/plain"],
        [".cdda", "audio/aiff"],
        [".cdf", "application/x-cdf"],
        [".cer", "application/x-x509-ca-cert"],
        [".chm", "application/octet-stream"],
        [".class", "application/x-java-applet"],
        [".clp", "application/x-msclip"],
        [".cmx", "image/x-cmx"],
        [".cnf", "text/plain"],
        [".cod", "image/cis-cod"],
        [".config", "application/xml"],
        [".contact", "text/x-ms-contact"],
        [".coverage", "application/xml"],
        [".cpio", "application/x-cpio"],
        [".cpp", "text/plain"],
        [".crd", "application/x-mscardfile"],
        [".crl", "application/pkix-crl"],
        [".crt", "application/x-x509-ca-cert"],
        [".cs", "text/plain"],
        [".csdproj", "text/plain"],
        [".csh", "application/x-csh"],
        [".csproj", "text/plain"],
        [".css", "text/css"],
        [".csv", "text/csv"],
        [".cur", "application/octet-stream"],
        [".cxx", "text/plain"],
        [".dat", "application/octet-stream"],
        [".datasource", "application/xml"],
        [".dbproj", "text/plain"],
        [".dcr", "application/x-director"],
        [".def", "text/plain"],
        [".deploy", "application/octet-stream"],
        [".der", "application/x-x509-ca-cert"],
        [".dgml", "application/xml"],
        [".dib", "image/bmp"],
        [".dif", "video/x-dv"],
        [".dir", "application/x-director"],
        [".disco", "text/xml"],
        [".dll", "application/x-msdownload"],
        [".dll.config", "text/xml"],
        [".dlm", "text/dlm"],
        [".doc", "application/msword"],
        [".docm", "application/vnd.ms-word.document.macroEnabled.12"],
        [".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
        [".dot", "application/msword"],
        [".dotm", "application/vnd.ms-word.template.macroEnabled.12"],
        [".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"],
        [".dsp", "application/octet-stream"],
        [".dsw", "text/plain"],
        [".dtd", "text/xml"],
        [".dtsConfig", "text/xml"],
        [".dv", "video/x-dv"],
        [".dvi", "application/x-dvi"],
        [".dwf", "drawing/x-dwf"],
        [".dwp", "application/octet-stream"],
        [".dxr", "application/x-director"],
        [".eml", "message/rfc822"],
        [".emz", "application/octet-stream"],
        [".eot", "application/octet-stream"],
        [".eps", "application/postscript"],
        [".etl", "application/etl"],
        [".etx", "text/x-setext"],
        [".evy", "application/envoy"],
        [".exe", "application/octet-stream"],
        [".exe.config", "text/xml"],
        [".fdf", "application/vnd.fdf"],
        [".fif", "application/fractals"],
        [".filters", "Application/xml"],
        [".fla", "application/octet-stream"],
        [".flr", "x-world/x-vrml"],
        [".flv", "video/x-flv"],
        [".fsscript", "application/fsharp-script"],
        [".fsx", "application/fsharp-script"],
        [".generictest", "application/xml"],
        [".gif", "image/gif"],
        [".group", "text/x-ms-group"],
        [".gsm", "audio/x-gsm"],
        [".gtar", "application/x-gtar"],
        [".gz", "application/x-gzip"],
        [".h", "text/plain"],
        [".hdf", "application/x-hdf"],
        [".hdml", "text/x-hdml"],
        [".hhc", "application/x-oleobject"],
        [".hhk", "application/octet-stream"],
        [".hhp", "application/octet-stream"],
        [".hlp", "application/winhlp"],
        [".hpp", "text/plain"],
        [".hqx", "application/mac-binhex40"],
        [".hta", "application/hta"],
        [".htc", "text/x-component"],
        [".htm", "text/html"],
        [".html", "text/html"],
        [".htt", "text/webviewhtml"],
        [".hxa", "application/xml"],
        [".hxc", "application/xml"],
        [".hxd", "application/octet-stream"],
        [".hxe", "application/xml"],
        [".hxf", "application/xml"],
        [".hxh", "application/octet-stream"],
        [".hxi", "application/octet-stream"],
        [".hxk", "application/xml"],
        [".hxq", "application/octet-stream"],
        [".hxr", "application/octet-stream"],
        [".hxs", "application/octet-stream"],
        [".hxt", "text/html"],
        [".hxv", "application/xml"],
        [".hxw", "application/octet-stream"],
        [".hxx", "text/plain"],
        [".i", "text/plain"],
        [".ico", "image/x-icon"],
        [".ics", "application/octet-stream"],
        [".idl", "text/plain"],
        [".ief", "image/ief"],
        [".iii", "application/x-iphone"],
        [".inc", "text/plain"],
        [".inf", "application/octet-stream"],
        [".inl", "text/plain"],
        [".ins", "application/x-internet-signup"],
        [".ipa", "application/x-itunes-ipa"],
        [".ipg", "application/x-itunes-ipg"],
        [".ipproj", "text/plain"],
        [".ipsw", "application/x-itunes-ipsw"],
        [".iqy", "text/x-ms-iqy"],
        [".isp", "application/x-internet-signup"],
        [".ite", "application/x-itunes-ite"],
        [".itlp", "application/x-itunes-itlp"],
        [".itms", "application/x-itunes-itms"],
        [".itpc", "application/x-itunes-itpc"],
        [".IVF", "video/x-ivf"],
        [".jar", "application/java-archive"],
        [".java", "application/octet-stream"],
        [".jck", "application/liquidmotion"],
        [".jcz", "application/liquidmotion"],
        [".jfif", "image/pjpeg"],
        [".jnlp", "application/x-java-jnlp-file"],
        [".jpb", "application/octet-stream"],
        [".jpe", "image/jpeg"],
        [".jpeg", "image/jpeg"],
        [".jpg", "image/jpeg"],
        [".js", "application/x-javascript"],
        [".json", "application/json"],
        [".jsx", "text/jscript"],
        [".jsxbin", "text/plain"],
        [".latex", "application/x-latex"],
        [".library-ms", "application/windows-library+xml"],
        [".lit", "application/x-ms-reader"],
        [".loadtest", "application/xml"],
        [".lpk", "application/octet-stream"],
        [".lsf", "video/x-la-asf"],
        [".lst", "text/plain"],
        [".lsx", "video/x-la-asf"],
        [".lzh", "application/octet-stream"],
        [".m13", "application/x-msmediaview"],
        [".m14", "application/x-msmediaview"],
        [".m1v", "video/mpeg"],
        [".m2t", "video/vnd.dlna.mpeg-tts"],
        [".m2ts", "video/vnd.dlna.mpeg-tts"],
        [".m2v", "video/mpeg"],
        [".m3u", "audio/x-mpegurl"],
        [".m3u8", "audio/x-mpegurl"],
        [".m4a", "audio/m4a"],
        [".m4b", "audio/m4b"],
        [".m4p", "audio/m4p"],
        [".m4r", "audio/x-m4r"],
        [".m4v", "video/x-m4v"],
        [".mac", "image/x-macpaint"],
        [".mak", "text/plain"],
        [".man", "application/x-troff-man"],
        [".manifest", "application/x-ms-manifest"],
        [".map", "text/plain"],
        [".master", "application/xml"],
        [".mda", "application/msaccess"],
        [".mdb", "application/x-msaccess"],
        [".mde", "application/msaccess"],
        [".mdp", "application/octet-stream"],
        [".me", "application/x-troff-me"],
        [".mfp", "application/x-shockwave-flash"],
        [".mht", "message/rfc822"],
        [".mhtml", "message/rfc822"],
        [".mid", "audio/mid"],
        [".midi", "audio/mid"],
        [".mix", "application/octet-stream"],
        [".mk", "text/plain"],
        [".mmf", "application/x-smaf"],
        [".mno", "text/xml"],
        [".mny", "application/x-msmoney"],
        [".mod", "video/mpeg"],
        [".mov", "video/quicktime"],
        [".movie", "video/x-sgi-movie"],
        [".mp2", "video/mpeg"],
        [".mp2v", "video/mpeg"],
        [".mp3", "audio/mpeg"],
        [".mp4", "video/mp4"],
        [".mp4v", "video/mp4"],
        [".mpa", "video/mpeg"],
        [".mpe", "video/mpeg"],
        [".mpeg", "video/mpeg"],
        [".mpf", "application/vnd.ms-mediapackage"],
        [".mpg", "video/mpeg"],
        [".mpp", "application/vnd.ms-project"],
        [".mpv2", "video/mpeg"],
        [".mqv", "video/quicktime"],
        [".ms", "application/x-troff-ms"],
        [".msi", "application/octet-stream"],
        [".mso", "application/octet-stream"],
        [".mts", "video/vnd.dlna.mpeg-tts"],
        [".mtx", "application/xml"],
        [".mvb", "application/x-msmediaview"],
        [".mvc", "application/x-miva-compiled"],
        [".mxp", "application/x-mmxp"],
        [".nc", "application/x-netcdf"],
        [".nsc", "video/x-ms-asf"],
        [".nws", "message/rfc822"],
        [".ocx", "application/octet-stream"],
        [".oda", "application/oda"],
        [".odc", "text/x-ms-odc"],
        [".odh", "text/plain"],
        [".odl", "text/plain"],
        [".odp", "application/vnd.oasis.opendocument.presentation"],
        [".ods", "application/oleobject"],
        [".odt", "application/vnd.oasis.opendocument.text"],
        [".one", "application/onenote"],
        [".onea", "application/onenote"],
        [".onepkg", "application/onenote"],
        [".onetmp", "application/onenote"],
        [".onetoc", "application/onenote"],
        [".onetoc2", "application/onenote"],
        [".orderedtest", "application/xml"],
        [".osdx", "application/opensearchdescription+xml"],
        [".p10", "application/pkcs10"],
        [".p12", "application/x-pkcs12"],
        [".p7b", "application/x-pkcs7-certificates"],
        [".p7c", "application/pkcs7-mime"],
        [".p7m", "application/pkcs7-mime"],
        [".p7r", "application/x-pkcs7-certreqresp"],
        [".p7s", "application/pkcs7-signature"],
        [".pbm", "image/x-portable-bitmap"],
        [".pcast", "application/x-podcast"],
        [".pct", "image/pict"],
        [".pcx", "application/octet-stream"],
        [".pcz", "application/octet-stream"],
        [".pdf", "application/pdf"],
        [".pfb", "application/octet-stream"],
        [".pfm", "application/octet-stream"],
        [".pfx", "application/x-pkcs12"],
        [".pgm", "image/x-portable-graymap"],
        [".pic", "image/pict"],
        [".pict", "image/pict"],
        [".pkgdef", "text/plain"],
        [".pkgundef", "text/plain"],
        [".pko", "application/vnd.ms-pki.pko"],
        [".pls", "audio/scpls"],
        [".pma", "application/x-perfmon"],
        [".pmc", "application/x-perfmon"],
        [".pml", "application/x-perfmon"],
        [".pmr", "application/x-perfmon"],
        [".pmw", "application/x-perfmon"],
        [".png", "image/png"],
        [".pnm", "image/x-portable-anymap"],
        [".pnt", "image/x-macpaint"],
        [".pntg", "image/x-macpaint"],
        [".pnz", "image/png"],
        [".pot", "application/vnd.ms-powerpoint"],
        [".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"],
        [".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"],
        [".ppa", "application/vnd.ms-powerpoint"],
        [".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"],
        [".ppm", "image/x-portable-pixmap"],
        [".pps", "application/vnd.ms-powerpoint"],
        [".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"],
        [".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"],
        [".ppt", "application/vnd.ms-powerpoint"],
        [".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"],
        [".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"],
        [".prf", "application/pics-rules"],
        [".prm", "application/octet-stream"],
        [".prx", "application/octet-stream"],
        [".ps", "application/postscript"],
        [".psc1", "application/PowerShell"],
        [".psd", "application/octet-stream"],
        [".psess", "application/xml"],
        [".psm", "application/octet-stream"],
        [".psp", "application/octet-stream"],
        [".pub", "application/x-mspublisher"],
        [".pwz", "application/vnd.ms-powerpoint"],
        [".qht", "text/x-html-insertion"],
        [".qhtm", "text/x-html-insertion"],
        [".qt", "video/quicktime"],
        [".qti", "image/x-quicktime"],
        [".qtif", "image/x-quicktime"],
        [".qtl", "application/x-quicktimeplayer"],
        [".qxd", "application/octet-stream"],
        [".ra", "audio/x-pn-realaudio"],
        [".ram", "audio/x-pn-realaudio"],
        [".rar", "application/octet-stream"],
        [".ras", "image/x-cmu-raster"],
        [".rat", "application/rat-file"],
        [".rc", "text/plain"],
        [".rc2", "text/plain"],
        [".rct", "text/plain"],
        [".rdlc", "application/xml"],
        [".resx", "application/xml"],
        [".rf", "image/vnd.rn-realflash"],
        [".rgb", "image/x-rgb"],
        [".rgs", "text/plain"],
        [".rm", "application/vnd.rn-realmedia"],
        [".rmi", "audio/mid"],
        [".rmp", "application/vnd.rn-rn_music_package"],
        [".roff", "application/x-troff"],
        [".rpm", "audio/x-pn-realaudio-plugin"],
        [".rqy", "text/x-ms-rqy"],
        [".rtf", "application/rtf"],
        [".rtx", "text/richtext"],
        [".ruleset", "application/xml"],
        [".s", "text/plain"],
        [".safariextz", "application/x-safari-safariextz"],
        [".scd", "application/x-msschedule"],
        [".sct", "text/scriptlet"],
        [".sd2", "audio/x-sd2"],
        [".sdp", "application/sdp"],
        [".sea", "application/octet-stream"],
        [".searchConnector-ms", "application/windows-search-connector+xml"],
        [".setpay", "application/set-payment-initiation"],
        [".setreg", "application/set-registration-initiation"],
        [".settings", "application/xml"],
        [".sgimb", "application/x-sgimb"],
        [".sgml", "text/sgml"],
        [".sh", "application/x-sh"],
        [".shar", "application/x-shar"],
        [".shtml", "text/html"],
        [".sit", "application/x-stuffit"],
        [".sitemap", "application/xml"],
        [".skin", "application/xml"],
        [".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"],
        [".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"],
        [".slk", "application/vnd.ms-excel"],
        [".sln", "text/plain"],
        [".slupkg-ms", "application/x-ms-license"],
        [".smd", "audio/x-smd"],
        [".smi", "application/octet-stream"],
        [".smx", "audio/x-smd"],
        [".smz", "audio/x-smd"],
        [".snd", "audio/basic"],
        [".snippet", "application/xml"],
        [".snp", "application/octet-stream"],
        [".sol", "text/plain"],
        [".sor", "text/plain"],
        [".spc", "application/x-pkcs7-certificates"],
        [".spl", "application/futuresplash"],
        [".src", "application/x-wais-source"],
        [".srf", "text/plain"],
        [".SSISDeploymentManifest", "text/xml"],
        [".ssm", "application/streamingmedia"],
        [".sst", "application/vnd.ms-pki.certstore"],
        [".stl", "application/vnd.ms-pki.stl"],
        [".sv4cpio", "application/x-sv4cpio"],
        [".sv4crc", "application/x-sv4crc"],
        [".svc", "application/xml"],
        [".swf", "application/x-shockwave-flash"],
        [".t", "application/x-troff"],
        [".tar", "application/x-tar"],
        [".tcl", "application/x-tcl"],
        [".testrunconfig", "application/xml"],
        [".testsettings", "application/xml"],
        [".tex", "application/x-tex"],
        [".texi", "application/x-texinfo"],
        [".texinfo", "application/x-texinfo"],
        [".tgz", "application/x-compressed"],
        [".thmx", "application/vnd.ms-officetheme"],
        [".thn", "application/octet-stream"],
        [".tif", "image/tiff"],
        [".tiff", "image/tiff"],
        [".tlh", "text/plain"],
        [".tli", "text/plain"],
        [".toc", "application/octet-stream"],
        [".tr", "application/x-troff"],
        [".trm", "application/x-msterminal"],
        [".trx", "application/xml"],
        [".ts", "video/vnd.dlna.mpeg-tts"],
        [".tsv", "text/tab-separated-values"],
        [".ttf", "application/octet-stream"],
        [".tts", "video/vnd.dlna.mpeg-tts"],
        [".txt", "text/plain"],
        [".u32", "application/octet-stream"],
        [".uls", "text/iuls"],
        [".user", "text/plain"],
        [".ustar", "application/x-ustar"],
        [".vb", "text/plain"],
        [".vbdproj", "text/plain"],
        [".vbk", "video/mpeg"],
        [".vbproj", "text/plain"],
        [".vbs", "text/vbscript"],
        [".vcf", "text/x-vcard"],
        [".vcproj", "Application/xml"],
        [".vcs", "text/plain"],
        [".vcxproj", "Application/xml"],
        [".vddproj", "text/plain"],
        [".vdp", "text/plain"],
        [".vdproj", "text/plain"],
        [".vdx", "application/vnd.ms-visio.viewer"],
        [".vml", "text/xml"],
        [".vscontent", "application/xml"],
        [".vsct", "text/xml"],
        [".vsd", "application/vnd.visio"],
        [".vsi", "application/ms-vsi"],
        [".vsix", "application/vsix"],
        [".vsixlangpack", "text/xml"],
        [".vsixmanifest", "text/xml"],
        [".vsmdi", "application/xml"],
        [".vspscc", "text/plain"],
        [".vss", "application/vnd.visio"],
        [".vsscc", "text/plain"],
        [".vssettings", "text/xml"],
        [".vssscc", "text/plain"],
        [".vst", "application/vnd.visio"],
        [".vstemplate", "text/xml"],
        [".vsto", "application/x-ms-vsto"],
        [".vsw", "application/vnd.visio"],
        [".vsx", "application/vnd.visio"],
        [".vtx", "application/vnd.visio"],
        [".wav", "audio/wav"],
        [".wave", "audio/wav"],
        [".wax", "audio/x-ms-wax"],
        [".wbk", "application/msword"],
        [".wbmp", "image/vnd.wap.wbmp"],
        [".wcm", "application/vnd.ms-works"],
        [".wdb", "application/vnd.ms-works"],
        [".wdp", "image/vnd.ms-photo"],
        [".webarchive", "application/x-safari-webarchive"],
        [".webtest", "application/xml"],
        [".wiq", "application/xml"],
        [".wiz", "application/msword"],
        [".wks", "application/vnd.ms-works"],
        [".WLMP", "application/wlmoviemaker"],
        [".wlpginstall", "application/x-wlpg-detect"],
        [".wlpginstall3", "application/x-wlpg3-detect"],
        [".wm", "video/x-ms-wm"],
        [".wma", "audio/x-ms-wma"],
        [".wmd", "application/x-ms-wmd"],
        [".wmf", "application/x-msmetafile"],
        [".wml", "text/vnd.wap.wml"],
        [".wmlc", "application/vnd.wap.wmlc"],
        [".wmls", "text/vnd.wap.wmlscript"],
        [".wmlsc", "application/vnd.wap.wmlscriptc"],
        [".wmp", "video/x-ms-wmp"],
        [".wmv", "video/x-ms-wmv"],
        [".wmx", "video/x-ms-wmx"],
        [".wmz", "application/x-ms-wmz"],
        [".wpl", "application/vnd.ms-wpl"],
        [".wps", "application/vnd.ms-works"],
        [".wri", "application/x-mswrite"],
        [".wrl", "x-world/x-vrml"],
        [".wrz", "x-world/x-vrml"],
        [".wsc", "text/scriptlet"],
        [".wsdl", "text/xml"],
        [".wvx", "video/x-ms-wvx"],
        [".x", "application/directx"],
        [".xaf", "x-world/x-vrml"],
        [".xaml", "application/xaml+xml"],
        [".xap", "application/x-silverlight-app"],
        [".xbap", "application/x-ms-xbap"],
        [".xbm", "image/x-xbitmap"],
        [".xdr", "text/plain"],
        [".xht", "application/xhtml+xml"],
        [".xhtml", "application/xhtml+xml"],
        [".xla", "application/vnd.ms-excel"],
        [".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"],
        [".xlc", "application/vnd.ms-excel"],
        [".xld", "application/vnd.ms-excel"],
        [".xlk", "application/vnd.ms-excel"],
        [".xll", "application/vnd.ms-excel"],
        [".xlm", "application/vnd.ms-excel"],
        [".xls", "application/vnd.ms-excel"],
        [".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"],
        [".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"],
        [".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
        [".xlt", "application/vnd.ms-excel"],
        [".xltm", "application/vnd.ms-excel.template.macroEnabled.12"],
        [".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"],
        [".xlw", "application/vnd.ms-excel"],
        [".xml", "text/xml"],
        [".xmta", "application/xml"],
        [".xof", "x-world/x-vrml"],
        [".XOML", "text/plain"],
        [".xpm", "image/x-xpixmap"],
        [".xps", "application/vnd.ms-xpsdocument"],
        [".xrm-ms", "text/xml"],
        [".xsc", "application/xml"],
        [".xsd", "text/xml"],
        [".xsf", "text/xml"],
        [".xsl", "text/xml"],
        [".xslt", "text/xml"],
        [".xsn", "application/octet-stream"],
        [".xss", "application/xml"],
        [".xtp", "application/octet-stream"],
        [".xwd", "image/x-xwindowdump"],
        [".z", "application/x-compress"],
        [".zip", "application/x-zip-compressed"]
];

// ----------------------- End of Extensions to MIME --------- //
Urmas Repinski
quelle
- Ich habe das mit PDF-Dateien versucht. Die Datei wird heruntergeladen, ist aber immer beschädigt. Irgendwelche Vorschläge? Vielen Dank
Shrivaths Kulkarni
2

für mich funktioniert das ok getestet in chrome v72

function down_file(url,name){
var a = $("<a>")
    .attr("href", url)
    .attr("download", name)
    .appendTo("body");
a[0].click();
a.remove();
}

down_file('https://www.useotools.com/uploads/nulogo[1].png','logo.png')
user889030
quelle
Dies ist genau der gleiche Ansatz wie in der Antwort von Imagine Breaker vor Jahren, jedoch mit dem zusätzlichen Nachteil, dass jQuery erforderlich ist.
Mark Amery
1

Ich habe gute Ergebnisse mit der Verwendung eines FORM-Tags erzielt, da es überall funktioniert und Sie keine temporären Dateien auf dem Server erstellen müssen. Die Methode funktioniert so.

Auf der Clientseite (Seiten-HTML) erstellen Sie ein unsichtbares Formular wie dieses

<form method="POST" action="/download.php" target="_blank" id="downloadForm">
    <input type="hidden" name="data" id="csv">
</form>

Dann fügen Sie diesen Javascript-Code zu Ihrer Schaltfläche hinzu:

$('#button').click(function() {
     $('#csv').val('---your data---');
     $('#downloadForm').submit();
}

Auf der Serverseite haben Sie folgenden PHP-Code download.php:

<?php
header('Content-Type: text/csv');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=out.csv');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . strlen($data));

echo $_REQUEST['data'];
exit();

Sie können sogar Zip-Dateien Ihrer Daten wie folgt erstellen:

<?php

$file = tempnam("tmp", "zip");

$zip = new ZipArchive();
$zip->open($file, ZipArchive::OVERWRITE);
$zip->addFromString('test.csv', $_REQUEST['data']);
$zip->close();

header('Content-Type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="file.zip"');
readfile($file);
unlink($file); 

Das Beste daran ist, dass keine Restdateien auf Ihrem Server verbleiben, da alles im laufenden Betrieb erstellt und zerstört wird!

Supersan
quelle
0

Die Antwort von Hitesh am 30. Dezember 13 funktioniert tatsächlich. Es muss nur ein wenig angepasst werden:

Die PHP-Datei kann sich selbst aufrufen. Mit anderen Worten, erstellen Sie einfach eine Datei mit dem Namen saveAs.php und fügen Sie diesen Code ein ...

        <a href="saveAs.php?file_source=YourDataFile.pdf">Download pdf here</a>

    <?php
        if (isset($_GET['file_source'])) {
            $fullPath = $_GET['file_source'];
            if($fullPath) {
                $fsize = filesize($fullPath);
                $path_parts = pathinfo($fullPath);
                $ext = strtolower($path_parts["extension"]);
                switch ($ext) {
                    case "pdf":
                    header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
                    header("Content-type: application/pdf"); // add here more headers for diff. extensions
                    break;
                    default;
                    header("Content-type: application/octet-stream");
                    header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
                }
                if($fsize) {//checking if file size exist
                  header("Content-length: $fsize");
                }
                readfile($fullPath);
                exit;
            }
        }
    ?>
Amger
quelle
0

Diese Funktionen werden in stacktrace.js verwendet :

/**
 * Try XHR methods in order and store XHR factory.
 *
 * @return <Function> XHR function or equivalent
 */
var createXMLHTTPObject = function() {
    var xmlhttp, XMLHttpFactories = [
        function() {
            return new XMLHttpRequest();
        }, function() {
            return new ActiveXObject('Msxml2.XMLHTTP');
        }, function() {
            return new ActiveXObject('Msxml3.XMLHTTP');
        }, function() {
            return new ActiveXObject('Microsoft.XMLHTTP');
        }
    ];
    for (var i = 0; i < XMLHttpFactories.length; i++) {
        try {
            xmlhttp = XMLHttpFactories[i]();
            // Use memoization to cache the factory
            createXMLHTTPObject = XMLHttpFactories[i];
            return xmlhttp;
        } catch (e) {
        }
    }
}

/**
 * @return the text from a given URL
 */
function ajax(url) {
    var req = createXMLHTTPObject();
    if (req) {
        try {
            req.open('GET', url, false);
            req.send(null);
            return req.responseText;
        } catch (e) {
        }
    }
    return '';
}
BT
quelle
Dies ... scheint nur für XHR zu sein, nicht für Dateidownloads? Ich sehe die Relevanz hier nicht.
Mark Amery
0

Ich schlage vor, Sie verwenden das Mousedown-Ereignis, das VOR dem Klickereignis aufgerufen wird. Auf diese Weise behandelt der Browser das Klickereignis auf natürliche Weise, wodurch jede Verrücktheit des Codes vermieden wird:

(function ($) {


    // with this solution, the browser handles the download link naturally (tested in chrome and firefox)
    $(document).ready(function () {

        var url = '/private/downloads/myfile123.pdf';
        $("a#someID").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);
Leng
quelle
0

Hervorragende Lösung von Corbacho, ich habe mich gerade angepasst, um die Var loszuwerden

function downloadURL(url) {
    if( $('#idown').length ){
        $('#idown').attr('src',url);
    }else{
        $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
    }
}
ebelendez
quelle
0

Firefox und Chrome getestet:

var link = document.createElement('a');
link.download = 'fileName.ext'
link.href = 'http://down.serv/file.ext';

// Because firefox not executing the .click() well
// We need to create mouse event initialization.
var clickEvent = document.createEvent("MouseEvent");
clickEvent.initEvent("click", true, true);

link.dispatchEvent(clickEvent);

Dies ist eigentlich die "Chrome" -Lösung für Firefox (ich habe sie nicht in anderen Browsern getestet, bitte hinterlassen Sie Kommentare zur Kompilierbarkeit).

Ifch0o1
quelle
0

Es gibt so viele kleine Dinge, die beim Herunterladen einer Datei passieren können. Die Inkonsistenz zwischen Browsern allein ist ein Albtraum. Am Ende habe ich diese tolle kleine Bibliothek benutzt. https://github.com/rndme/download

Das Schöne daran ist, dass es nicht nur für URLs, sondern auch für clientseitige Daten, die Sie herunterladen möchten, flexibel ist.

  1. Textzeichenfolge
  2. TextdatenURL
  3. Text-Blob
  4. Textfelder
  5. HTML-Zeichenfolge
  6. HTML-Blob
  7. Ajax-Rückruf
  8. Binärdateien
Donny V.
quelle
-1

Mit Ankertag und PHP ist dies möglich. Überprüfen Sie diese Antwort

JQuery Ajax fordert zum Herunterladen von PDF-Dateien auf

HTML
    <a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a>

PHP
<?php
$fullPath = $_GET['fileSource'];
if($fullPath) {
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);
    switch ($ext) {
        case "pdf":
        header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
        header("Content-type: application/pdf"); // add here more headers for diff. extensions
        break;
        default;
        header("Content-type: application/octet-stream");
        header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    }
    if($fsize) {//checking if file size exist
      header("Content-length: $fsize");
    }
    readfile($fullPath);
    exit;
}
?>

Ich überprüfe die Dateigröße, denn wenn Sie PDF von der CDN-Cloudfront laden, erhalten Sie nicht die Größe des Dokuments, wodurch das Dokument in 0 KB heruntergeladen werden muss. Um dies zu vermeiden, überprüfe ich diese Bedingung

 if($fsize) {//checking if file size exist
      header("Content-length: $fsize");
    }
Hitesh
quelle
-1

Ich weiß, dass ich zu spät zur Party komme, aber ich möchte meine Lösung teilen, die eine Variation der obigen Lösung von Imagine Breaker ist. Ich habe versucht, seine Lösung zu verwenden, weil mir seine Lösung am einfachsten und leichtesten erscheint. Aber wie andere gesagt haben, hat es bei einigen Browsern nicht funktioniert, deshalb habe ich es mit jquery variiert.

Hoffe das könnte jemandem da draußen helfen.

function download(url) {
  var link = document.createElement("a");
  $(link).click(function(e) {
    e.preventDefault();
    window.location.href = url;
  });
  $(link).click();
}
genki98
quelle
Dieser ganze Funktionskörper ist nur eine überkomplizierte Methode window.location.href = url. Der von Ihnen erstellte Link wird für nichts verwendet.
Mark Amery
-1

Hinweis: Wird nicht in allen Browsern unterstützt.

Ich suchte nach einer Möglichkeit, eine Datei mit jquery herunterzuladen, ohne von Anfang an die Datei-URL im href-Attribut festlegen zu müssen.

jQuery('<a/>', {
    id: 'downloadFile',
    href: 'http://cdn.sstatic.net/Sites/stackoverflow/img/[email protected]',
    style: 'display:hidden;',
    download: ''
}).appendTo('body');

$("#downloadFile")[0].click();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Xero Kael
quelle
-1

Ich verwende die Lösung von @ rakaloof ohne JQuery (weil Sie sie hier nicht benötigen ). Danke für die Idee! Hier ist eine formularbasierte Lösung von vanillaJS:

const uri = 'https://upload.wikimedia.org/wikipedia/commons/b/bb/Test_ogg_mp3_48kbps.wav';
let form = document.createElement("form");
form.setAttribute('action', uri);
document.body.appendChild(form);
form.submit();
document.body.removeChild(document.body.lastElementChild);

aloisdg wechselt zu codidact.com
quelle