Traitant de fichier de la pièce jointe en jquery.ajax
Dans ma page web, j'ai un bouton pour le téléchargement d'un fichier. Si il n'y a pas de fichier à télécharger, puis j'aimerais vous montrer un message tout en restant sur la même page. Le code javascript suivant fonctionne quand il y a un fichier à télécharger (id est l'id de fichier):
function downloadFile(id) {
window.location = '/myapp.com/download_file/' + id;
}
Mon serveur enregistre le fichier contenu dans le corps de la réponse et des ensembles de 'Content-Disposition de" en "pièce jointe".
Maintenant, quand il n'y a pas de fichier j'aimerais revenir un peu de texte en disant qu'il n'y a pas de fichier à télécharger. Donc j'aimerais faire quelque chose comme ci-dessous:
function downloadFile(id) {
$.ajax({
url: '/myapp.com/download_file/' + id,
success: function () {
//if (attachemnt) {
// download file: just pass response to the browser?
//} else {
// show error text
//}
},
error: function () {
//show error message
}
});
}
Donc, ma question est:
- Comment puis-je mettre en œuvre le au-dessus de la fonctionnalité?
- Plus précisément, si il y a un fichier de la pièce jointe dans la réponse, est-il possible de transmettre la réponse au navigateur, de sorte que le navigateur peut gérer téléchargement de fichier?
Mise à JOUR:
Je peux gérer "pas de fichier" cas maintenant:
$.ajax({
url: '{{ path('download_prev_other_data', {'other_data_id':form.vars.value.getOtherDataId() }) }}',
success: function (data, textStatus, jqXHR) {
var header = jqXHR.getResponseHeader('Content-Disposition');
if (header && header.indexOf('attachment') === 0) {
//pass the original response to the browser
} else {
alert(data); //data is just text in my case explaining there was no file
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert(errorThrown);
}
});
Donc, ma 2ème question, "comment transmettre l'original de la réponse au navigateur" n'est pas encore répondu.
OriginalL'auteur synergetic | 2013-08-14
Vous devez vous connecter pour publier un commentaire.
Il est prêt plugin pour cela avec le code source: jquery.fileDownload.js Bibliothèque
Ensuite, vous devez l'indiquer dans votre post que je ne souhaite pas utiliser n'importe quel plugin.
il est vraiment difficile d'écrire une telle fonctionnalité à partir de zéro parce que vous avez besoin pour gérer de bureau et les navigateurs mobiles (et par exemple de quelques bugs d'iOS). Vous pouvez regarder ici: github.com/johnculviner/jquery.fileDownload/blob/master/src/... pour voir l'intégralité du code source du plugin ci-dessus. C'est à l'aide de cacher iframe et comunicates avec elle
OriginalL'auteur Piotr Stapp
Vous ne peut pas utiliser ajax pour le téléchargement de fichier lors de compter sur navigateur standard possibilités. Je pense que la meilleure solution est d'utiliser caché iframe.
Créer
iframe
sur la page de démarrage avec un contenu vide et videsrc
. alors si vous voulez télécharger fichier de mise à jour de l'iframesrc
avec l'url du fichier. Avant de vous avez besoin pour préparerload
gestionnaire d'événement pouriframe
. Gestionnaire doit vérifier le contenu de l'iframe (par exemple, le corps) pour le message d'erreur. Si oui - vous pouvez afficher un message personnalisé.Vous ne pouvez pas gérer succès (autant que je sache) parce que le navigateur gère automatiquement et affiche "enregistrer sous" boîte de dialogue.
Remarque:
$('#frame').contents().find('body')
.load
événement déclencheur pouriframe
- être prêt à y faire face aussi après la page principale est chargé (vide/initialeiframe
état)Je pense, que vous pouvez également envisager l'utilisation de différentes demande de vérifier & pour le téléchargement de la pièce jointe. Vérifier avec
POST
la demande et vérifier sur le côté de serveur si la pièce jointe peut être trouvé. Si donc la réponse de l'état OK, puis utilisezGET
demande sur le côté client pour récupérer la pièce jointe. Dans ce cas, généralementwindow.open
suffit de télécharger le fichier. Navigateur envoieGET
requête elle-même, et les poignées de téléchargement.Remarque:
N'oubliez pas d'envoyer l'en-tête avec pièce jointe le contenu de la réponse, comme ci-dessous:
"Content-Disposition", "attachment; filename=yourFileName"
OriginalL'auteur Saram