Télécharger un fichier à l'aide de Javascript / jQuery

358

J'ai une exigence très similaire spécifiée ici .

J'ai besoin que le navigateur de l'utilisateur démarre un téléchargement manuellement lorsque $('a#someID').click();

Mais je ne peux pas utiliser la window.hrefméthode, car elle remplace le contenu de la page actuelle par le fichier que vous essayez de télécharger.

Au lieu de cela, je souhaite ouvrir le téléchargement dans une nouvelle fenêtre / un nouvel onglet. Comment est-ce possible?

Mithun Sreedharan
la source
J'ai essayé de nombreuses réponses dans des questions connexes, et c'est la réponse définitive .
Basj
La définition de window.location.href fonctionne pour moi. De plus, le contenu de la fenêtre ne change PAS. Je suppose que vous avez utilisé le mauvais type de contenu?
BluE

Réponses:

379

Utilisez un invisible <iframe>:

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

Pour forcer le navigateur à télécharger un fichier qu'il serait autrement capable de rendre (tel que des fichiers HTML ou texte), vous devez que le serveur définisse le type MIME du fichier sur une valeur absurde, telle que application/x-please-download-meou alternativement application/octet-stream, qui est utilisée pour les binaires arbitraires Les données.

Si vous souhaitez uniquement l'ouvrir dans un nouvel onglet, la seule façon de le faire est que l'utilisateur clique sur un lien avec son targetattribut défini sur _blank.

Dans jQuery:

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

Chaque fois que vous cliquez sur ce lien, il télécharge le fichier dans un nouvel onglet / fenêtre.

Randy the Dev
la source
4
Une page Web ne peut pas ouvrir automatiquement un nouvel onglet. Pour forcer le navigateur à télécharger, demandez au serveur d'envoyer le fichier pdf avec un type MIME non-sens, tel que application / x-please-download-me
Randy the Dev
14
Bien fait! Résout bien le problème. Cependant, vous voudrez peut-être utiliser: iframe.style.display = 'none'; cela masquera complètement l'iframe. Votre implémentation actuelle rendra l'iframe invisible, mais l'iframe occupera toujours de l'espace en bas de la page, provoquant un espace blanc supplémentaire.
Akrikos
2
Cela "semi" fonctionne pour moi. J'ai créé le test html simple suivant: <html> <body> <iframe src = "fileurl"> </iframe> </body> </html> et il est téléchargé, mais dans la console Chrome, je vois que le téléchargement a été "annulé" et apparaît en rouge. Cela fait partie d'une application Web mobile plus grande, et le fait qu'elle soit annulée interrompt l'application, car elle provoque une défaillance Web générale. Un moyen de contourner cela?
Sagi Mann
27
Un bel extrait. Cependant, définir un type de choses absurde est un peu dérangeant. Pour demander au navigateur de télécharger un fichier qu'il peut rendre, utilisez l'en-tête suivant: Content-Disposition: attachment; filename="downloaded.pdf"(vous pouvez bien sûr personnaliser le nom du fichier selon vos besoins).
rixo
2
Comment forcer le téléchargement sans serveur? Donc juste une page html avec du javascript.
Rodrigo Ruiz
221

Mise à jour des navigateurs modernes 2019

C'est l'approche que je recommanderais maintenant avec quelques mises en garde:

  • Un navigateur relativement moderne est requis
  • Si le fichier devrait être très volumineux, vous devriez probablement faire quelque chose de similaire à l'approche d'origine (iframe et cookie) car certaines des opérations ci-dessous pourraient probablement consommer de la mémoire système au moins aussi grande que le fichier en cours de téléchargement et / ou un autre processeur intéressant. Effets secondaires.

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 approche jQuery / iframe / cookie originale

J'ai créé le plugin jQuery File Download ( Demo ) ( GitHub ) qui pourrait également vous aider dans votre situation. Il fonctionne de manière assez similaire avec un iframe mais a quelques fonctionnalités intéressantes que j'ai trouvées assez pratiques:

  • Très facile à configurer avec de jolis visuels (boîte de dialogue jQuery UI, mais pas obligatoire), tout est également testé

  • L'utilisateur ne quitte jamais la même page à partir de laquelle il a lancé le téléchargement d'un fichier. Cette fonctionnalité devient cruciale pour les applications Web modernes

  • Les fonctions successCallback et failCallback vous permettent d'être explicite sur ce que l'utilisateur voit dans l'une ou l'autre situation

  • En conjonction avec jQuery UI, un développeur peut facilement afficher un modal indiquant à l'utilisateur qu'un téléchargement de fichier est en cours, dissoudre le modal après le début du téléchargement ou même informer l'utilisateur de manière conviviale qu'une erreur s'est produite. Voir la démo pour un exemple de cela. J'espère que cela aide quelqu'un!

Voici une démo de cas d'utilisation simple utilisant la source du plugin avec des promesses. La page de démonstration comprend également de nombreux autres exemples de «meilleure expérience utilisateur».

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });
John Culviner
la source
@JohnCulviner: puis-je envoyer des données json dans votre méthode de publication. Je l'ai essayé et j'ai échoué. Pouvez-vous me donner un échantillon
Saravanan
Est-il possible de passer des paramètres à l'appel? disons que j'ai besoin de passer quelques identifiants pour que le serveur génère le fichier que je souhaite télécharger, comment faire? merci
omer schleifer
J'ai fait le 100. Upvote. Merci pour votre temps - c'est vraiment précieux. Pensez à mettre un lien PayPal pour les dons. J'aurais donné.
Stephan Schinkel
Je l'ai essayé mais les rappels ne s'exécutent jamais. Le plug-in ouvrirait simplement la réponse du service dans un nouvel onglet même lorsque le service a renvoyé une erreur. Je ne veux pas que l'application ouvre un nouvel onglet et affiche la réponse du service en cas d'erreur. J'ai même ajouté le cookie pour indiquer que le téléchargement de fichier est vrai ou faux en cas de succès ou d'échec, mais la réponse s'ouvre toujours dans un nouvel onglet .. de toute façon pour résoudre ce problème .. J'utilise la méthode get.
Vishal Gulati
1
@MarkAmery qui fonctionne aussi comme d'autres réponses l'ont indiqué. Cette approche (AFAIK) ne vous donne pas de rétroaction sur le moment où le téléchargement commence, quand il s'est terminé et s'il s'est trompé, ce qui est pratique. Je pourrais ajouter cela à la réponse pour une option "tirer et oublier". De plus, l'attribut [download] ne permet pas non plus un POST ou quelque chose d'exotique.
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();
}

Vérifiez si votre ou vos navigateurs cibles exécuteront correctement l'extrait ci-dessus:
http://caniuse.com/#feat=download

Imagine Breaker
la source
1
télécharger le nom de fichier
n'a
7
Pour moi, ce serait parfait, mais cela ne fonctionne pas non plus sur Firefox. Une idée?
g07kore
2
Comme mentionné dans caniuse.com/#feat=download , cela ne fonctionne que pour les liens de même origine sur les versions récentes de Firefox et Chrome. Donc, si vos liens pointent vers un autre domaine, cela ne fonctionne pratiquement nulle part pour l'instant.
jean-baptiste
9
Pour que cela fonctionne sur Firefox, faites-le document.body.appendChild(link)avant le clic et après le clic que vous pouvez faire link.remove()pour éviter de polluer le DOM.
Okku
1
Vous pouvez également faire link.download = ""en sorte qu'il conserve son nom de fichier d'origine et éviter d'avoir à en définir un.
Okku
69

Je suis surpris que peu de gens connaissent l'attribut de téléchargement d'un élément. Aidez-nous à en parler! Vous pouvez avoir un lien html caché et faire un faux clic dessus. Si le lien html a l'attribut de téléchargement, il télécharge le fichier, pas l'affiche, quoi qu'il arrive. Voici le code. Il téléchargera une image de chat s'il peut la trouver.

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

Remarque: cela n'est pas pris en charge sur tous les navigateurs: http://www.w3schools.com/tags/att_a_download.asp

Utile 13 ans
la source
12
Non pris en charge dans IE et Safari
MatPag
9
Chrome télécharge, mais Firefox montre juste l'image.
Saran
+1 pour avoir fourni cet extrait exécutable. Cela m'a fait gagner du temps pour le tester, seulement pour découvrir que cela ne fonctionnera pas.
Doopy
4
Le dernier Chrome (août 2018) affiche également une image (en raison d'une restriction de sécurité absurde), alors échouez
user1156544
Chrome ne télécharge pas pour mp4s
Nearoo
53

Je recommande d'utiliser l' downloadattribut pour le téléchargement au lieu de jQuery:

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

Cela téléchargera votre fichier sans l'ouvrir.

Laura Chesches
la source
5
Il ne prend en charge que Chrome, Firefox, Opera et IE (> = 13.0)
Kunal Kakkad
Edge> = 13, pas IE. De plus, les implémentations d'Edge 13 sont boguées car le nom du fichier est ignoré et vous obtenez à la place un fichier avec un identifiant comme nom.
David
8
À mon avis, c'est la bonne réponse à la question. Les autres réponses ont du sens si vous devez prendre en charge des navigateurs plus anciens et avez besoin d'une solution de contournement.
crabCRUSHERclamCOLLECTOR
19

Si vous utilisez déjà jQuery, vous pouvez en profiter pour produire un petit extrait.
Une version jQuery de la réponse d'Andrew:

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
la source
Pour info, quelqu'un a suggéré (via la modification de mon message) d'ajouter $ idown.attr ('src', url); après avoir créé l'iframe pour la première fois. Je ne pense pas que ce soit nécessaire. Il définit déjà le 'src: url' dans l'étape de création.
corbacho
Aussi pour commenter que finalement je n'ai pas utilisé cette solution car IE 9 n'aimait pas les iframes créés dynamiquement pointant vers http: // lorsque vous êtes à l'intérieur d'un site Web https. J'ai dû utiliser "window.location.href", une solution qui a aussi quelques inconvénients
corbacho
la partie "if ($ idown)" ne fonctionnait pas pour moi dans le dernier Chrome (24), mais créait juste un nombre infini d'iframes. Peut-être parce que je voulais télécharger 12 choses en même temps?
nessur
6
La ifdéclaration devrait vraiment être:if( $idown && $idown.length > 0 )
iOnline247
3
Ne fait rien dans Chrome
jjxtra
11

Fonctionne sur Chrome, Firefox et IE8 et supérieur.

var link=document.createElement('a');
document.body.appendChild(link);
link.href=url ;
link.click();
EL missaoui habib
la source
Cela fonctionne également si vous n'ajoutez pas le lien au DOM.
Johnie Karr
À moins que les en-têtes renvoyés par le serveur n'indiquent le contraire, il s'agit simplement de naviguer vers url, et non de le télécharger.
Mark Amery
10

Exemple simple utilisant un 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;
};

Appelez ensuite la fonction où vous le souhaitez:

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

Aaron Lelevier
la source
10

Cela pourrait être utile si vous n'êtes pas obligé de naviguer sur une autre page. Ceci est une fonction javascript de base, elle peut donc être utilisée dans n'importe quelle plate-forme où le backend est en Javascript

window.location.assign('any url or file path')
Rohit Parte
la source
C'est probablement la solution la plus simple si vous pouvez définir vous-même le contentType. Je l'utilise comme: window.location.href = downloadFileUrl;
BluE
Si l'administrateur ne veut pas montrer l'URL à l'utilisateur, alors?
Naren Verma
9

Seulement sept ans plus tard, voici une solution jQuery d'une ligne utilisant un formulaire au lieu d'un iframe ou d'un lien:

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

Je l'ai testé dans

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

Si quelqu'un connaît les inconvénients de cette solution, je serais très heureux d'en entendre parler.


Démo complète:

<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
la source
7
Cela ne fonctionne pas si votre filePatha une chaîne de requête, car la soumission d'un formulaire écrasera la chaîne de requête dans l'attribut action.
Bobort
1
J'ai contourné cela en ajoutant une entrée au formulaire: var authInput = $("<input>").attr("type", "hidden").attr("name", "myQsKey").val('MyQsValue'); $('<form></form>') .attr('action', filePath) .append($(authInput)) .appendTo('body').submit().remove();C'est l'équivalent d'un accès:filepath?myQsKey=myValue
Harald Hoerwick
Cela ferme également les Websockets.
radu122
2
Cela ressemble à une façon vraiment compliqué à mettre window.locationà filePath. Je window.location = filePath;ferais juste la même chose.
Ivo Smits
Indépendamment de savoir s'il y a un inconvénient à cette solution, en soi, vous n'avez fourni aucun avantage à l'utiliser sur un lien. (Et il y a un inconvénient: vous ne pouvez pas utiliser l' downloadattribut de cette façon pour dire au navigateur que vous voulez un téléchargement indépendamment des en-têtes que le serveur renvoie, ce que vous pouvez faire avec un aélément.)
Mark Amery
5

Je ne sais pas si la question est tout simplement trop ancienne, mais définir window.location sur une URL de téléchargement fonctionnera, tant que le type de mime de téléchargement est correct (par exemple une archive zip).

var download = function(downloadURL) {

   location = downloadURL;

});

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

J'ai fini par utiliser l'extrait ci-dessous et cela fonctionne dans la plupart des navigateurs, mais pas testé dans IE.

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();
}

Mise à jour

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
la source
Quel est l'intérêt d'utiliser MouseEventici au lieu de toujours utiliser click? Et pourquoi ajouter le lien vers le document avant de cliquer dessus? Peut-être que cela présente des avantages par rapport à l'approche plus simple présentée dans stackoverflow.com/a/23013574/1709587 , mais si c'est le cas, ils ne sont pas expliqués ici.
Mark Amery
Cela fait un moment que j'ai posté cette réponse. Je ne me souviens pas s'il y a une raison derrière ces lignes de code inutiles.
Abk
3

Pour améliorer la réponse d'Imagine Breaker, ceci est pris en charge sur FF et IE:

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

En d'autres termes, utilisez simplement une dispatchEventfonction au lieu de click();

La masse
la source
En quoi est-ce une amélioration? Il semble que ce soit simplement une façon plus compliquée de faire la même chose.
Mark Amery
3

Peut-être que votre javascript ouvre une page qui télécharge simplement un fichier, comme lorsque vous faites glisser un lien de téléchargement vers un nouvel onglet:

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

Avec la fenêtre ouverte, ouvrez une page de téléchargement qui se ferme automatiquement.

Brian Waltse
la source
1
Cela crée une fenêtre contextuelle que la plupart des navigateurs bloquent
Ashton Wiersdorf
3

Le code le plus complet et le plus efficace (testé) pour le téléchargement de données pour FireFox, Chrome et IE est le suivant. Supposons que les données se trouvent dans le champ texarea , qui a id = 'textarea_area' et filename est le nom du fichier où les données seront téléchargées.

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();
    }

}

puis il suffit d'appeler

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

Pour le lancement du téléchargement.

Un tableau pour définir le type MIME correct pour la boîte de dialogue de téléchargement PEUT ÊTRE suivant:

// ----------------------- 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
la source
- J'essayais cela avec des fichiers pdf. Le fichier est téléchargé mais il est toujours corrompu. Aucune suggestion? Merci
Shrivaths Kulkarni
2

pour moi, cela fonctionne ok testé en 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
la source
C'est exactement la même approche que celle montrée dans la réponse d'Imagine Breaker des années plus tôt, mais avec l'inconvénient supplémentaire d'exiger jQuery.
Mark Amery
1

J'ai obtenu de bons résultats avec l'utilisation d'une balise FORM car elle fonctionne partout et vous n'avez pas à créer temporairement de fichiers sur le serveur. La méthode fonctionne comme ceci.

Côté client (page HTML) vous créez un formulaire invisible comme celui-ci

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

Ensuite, vous ajoutez ce code Javascript à votre bouton:

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

Côté serveur, vous avez le code PHP suivant 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();

Vous pouvez même créer des fichiers zip de vos données comme ceci:

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

La meilleure partie est qu'il ne laisse aucun fichier résiduel sur votre serveur car tout est créé et détruit à la volée!

supersan
la source
0

La réponse soumise par hitesh le 30 décembre 13 fonctionne en fait. Cela nécessite juste un petit ajustement:

Le fichier PHP peut s'appeler lui-même. En d'autres termes, il suffit de créer un fichier nommé saveAs.php, et d'y mettre ce code ...

        <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
la source
0

Ces fonctions sont utilisées dans stacktrace.js :

/**
 * 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
la source
Cela semble être uniquement pour XHR, pas pour le téléchargement de fichiers? Je ne vois pas la pertinence ici.
Mark Amery
0

Je vous suggère d'utiliser l'événement mousedown, qui est appelé AVANT l'événement click. De cette façon, le navigateur gère naturellement l'événement click, ce qui évite toute bizarrerie du code:

(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);
lingue
la source
0

Excellente solution de Corbacho, je viens de m'adapter pour me débarrasser du var

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

Firefox et Chrome testés:

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

Il s'agit en fait de la solution "chrome" pour Firefox (je ne l'ai pas testée sur d'autres navigateurs, donc laissez des commentaires sur la compilabilité)

Ifch0o1
la source
0

Il y a tellement de petites choses qui peuvent se produire lorsque vous essayez de télécharger un fichier. L'incohérence entre les navigateurs seuls est un cauchemar. J'ai fini par utiliser cette superbe petite bibliothèque. https://github.com/rndme/download

Une bonne chose à ce sujet est que sa flexibilité est non seulement pour les URL, mais pour les données côté client que vous souhaitez télécharger.

  1. chaîne de texte
  2. text dataURL
  3. blob de texte
  4. tableaux de texte
  5. chaîne html
  6. blob html
  7. rappel ajax
  8. fichiers binaires
Donny V.
la source
-1

En utilisant la balise d'ancrage et PHP, cela peut être fait, vérifiez cette réponse

Appel JQuery Ajax pour le téléchargement de fichiers PDF

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

Je vérifie la taille du fichier parce que si vous chargez le pdf à partir de CDN cloudfront, vous n'obtiendrez pas la taille du document qui force le document à télécharger en 0kb, Pour éviter cela, je vérifie cette condition

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

Je sais que je suis en retard pour la fête, mais je voudrais partager ma solution qui est la variante de la solution d'Imagine Breaker ci-dessus. J'ai essayé d'utiliser sa solution, car sa solution me semble la plus simple et la plus facile. Mais comme d'autres l'ont dit, cela ne fonctionnait pas pour certains navigateurs, j'ai donc mis des variations dessus en utilisant jquery.

J'espère que cela pourrait aider quelqu'un là-bas.

function download(url) {
  var link = document.createElement("a");
  $(link).click(function(e) {
    e.preventDefault();
    window.location.href = url;
  });
  $(link).click();
}
genki98
la source
Tout ce corps de fonction n'est qu'une façon de faire trop compliquée window.location.href = url. Le lien que vous créez n'est utilisé pour rien.
Mark Amery
-1

Remarque: non pris en charge dans tous les navigateurs.

Je cherchais un moyen de télécharger un fichier en utilisant jquery sans avoir à définir l'URL du fichier dans l'attribut href depuis le début.

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
la source
-1

J'utilise @ solution de rakaloof sans JQuery (parce que vous n'avez pas besoin ici ). Merci pour l'idée! Voici une solution basée sur un formulaire 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 passe à codidact.com
la source