Je veux envoyer une "demande de téléchargement ajax" lorsque je clique sur un bouton, j'ai donc essayé de cette manière:
javascript:
var xhr = new XMLHttpRequest();
xhr.open("GET", "download.php");
xhr.send();
download.php:
<?
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename= file.txt");
header("Content-Transfer-Encoding: binary");
readfile("file.txt");
?>
mais ne fonctionne pas comme prévu, comment puis-je faire? Merci d'avance
location.href='download.php';
Réponses:
Mise à jour du 27 avril 2015
L' attribut de téléchargement est à venir dans la scène HTML5 . Il est pris en charge dans Firefox et Chrome, et sera bientôt disponible sur IE11. Selon vos besoins, vous pouvez l'utiliser à la place d'une requête AJAX (ou en utilisant
window.location
) tant que le fichier que vous souhaitez télécharger est sur la même origine que votre site.Vous pouvez toujours faire la demande AJAX /
window.location
une solution de secours en utilisant du JavaScript pour tester si elledownload
est prise en charge et si ce n'est pas le cas, en la basculant en appelwindow.location
.Réponse originale
Une requête AJAX ne peut pas ouvrir l'invite de téléchargement car vous devez physiquement accéder au fichier pour demander le téléchargement. Au lieu de cela, vous pouvez utiliser une fonction de réussite pour accéder à download.php. Cela ouvrira l'invite de téléchargement mais ne changera pas la page actuelle.
Même si cela répond à la question, il est préférable d'utiliser
window.location
et d'éviter complètement la requête AJAX.la source
Pour que le navigateur télécharge un fichier, vous devez faire la demande comme ça:
la source
<a>
balise avec JS, "à la volée", mais vous devez l'ajouterdocument.body
. Vous voulez certainement le cacher en même temps.En fait, vous n'avez pas du tout besoin d'ajax pour cela. Si vous définissez simplement "download.php" comme href sur le bouton, ou, s'il ne s'agit pas d'un lien, utilisez:
Le navigateur doit reconnaître le téléchargement binaire et ne pas charger la page réelle, mais simplement servir le fichier en tant que téléchargement.
la source
window.location
est JavaScript.Solution multi-navigateurs, testée sur Chrome, Firefox, Edge, IE11.
Dans le DOM, ajoutez une balise de lien caché:
Ensuite:
la source
Authorization
?window.URL.revokeObjectURL(el.href);
aprèsel.click()
?C'est possible. Vous pouvez démarrer le téléchargement depuis une fonction ajax, par exemple juste après la création du fichier .csv.
J'ai une fonction ajax qui exporte une base de données de contacts vers un fichier .csv, et juste après la fin, il démarre automatiquement le téléchargement du fichier .csv. Donc, après avoir reçu le responseText et que tout va bien, je redirige le navigateur comme ceci:
Mon fichier download.php ressemble à ceci:
Il n'y a aucune actualisation de la page et le téléchargement du fichier démarre automatiquement.
REMARQUE - Testé dans les navigateurs suivants:
la source
je préfère
location.assign(url);
Exemple de syntaxe complet:
developer.mozilla.org/en-US/docs/Web/API/Location.assign
la source
Décoder un nom de fichier à partir de l'en-tête est un peu plus complexe ...
la source
Cette solution n'est pas très différente de celles ci-dessus, mais pour moi cela fonctionne très bien et je pense que c'est propre.
Je suggère d'encoder en base64 le côté serveur de fichiers (base64_encode (), si vous utilisez PHP) et d'envoyer les données encodées en base64 au client
Sur le client, vous faites ceci:
Ce code met les données encodées dans un lien et simule un clic sur le lien, puis il le supprime.
la source
Vos besoins sont couverts par
window.location('download.php');
Mais je pense que vous devez transmettre le fichier à télécharger, pas toujours télécharger le même fichier, et c'est pourquoi vous utilisez une requête, une option est de créer un fichier php aussi simple que showfile.php et faire une demande comme
showfile.php
où fichier est le nom de fichier passé via Get ou Post dans la requête, puis capture la réponse dans une fonction simplement
la source
il existe une autre solution pour télécharger une page web en ajax. Mais je fais référence à une page qui doit d'abord être traitée puis téléchargée.
Vous devez d'abord séparer le traitement de la page du téléchargement des résultats.
1) Seuls les calculs de page sont effectués dans l'appel ajax.
J'espère que cette solution pourra être utile pour beaucoup, comme elle l'était pour moi.
la source
Pour ceux qui recherchent une approche plus moderne, vous pouvez utiliser le
fetch API
. L'exemple suivant montre comment télécharger un fichier de feuille de calcul. Cela se fait facilement avec le code suivant.Je pense que cette approche est beaucoup plus facile à comprendre que d’autres
XMLHttpRequest
solutions. En outre, il a une syntaxe similaire à l'jQuery
approche, sans qu'il soit nécessaire d'ajouter des bibliothèques supplémentaires.Bien sûr, je vous conseillerais de vérifier dans quel navigateur vous développez, car cette nouvelle approche ne fonctionnera pas sur IE. Vous pouvez trouver la liste complète de compatibilité du navigateur sur le lien suivant .
Important : dans cet exemple, j'envoie une requête JSON à un serveur écoutant sur le donné
url
. Celaurl
doit être défini, sur mon exemple, je suppose que vous connaissez cette partie. Tenez également compte des en-têtes nécessaires pour que votre demande fonctionne. Puisque j'envoie un JSON, je dois ajouter l'en-Content-Type
tête et le définir surapplication/json; charset=utf-8
, afin d'indiquer au serveur le type de demande qu'il recevra.la source
La solution @Joao Marcos fonctionne pour moi mais j'ai dû modifier le code pour le faire fonctionner sur IE, ci-dessous si le code ressemble
la source