Extjs 4 (avec un code pour 3.4 ci-dessous) le téléchargement d'un fichier retourné par une requête post
J'ai vu des questions légèrement liée à cela, mais aucune réponse à mon problème. J'ai mis en place un Poste.Ajax.demande comme suit:
var paramsStringVar = 'param1=1¶m2=two¶m3=something¶m4=etc';
Ext.Ajax.request({
url: '/cgi-bin/url.pl',
method:'POST',
params:paramsStringVar,
timeout:120000,
success: function(response, opts){
var objhtml = response.responseText; //content returned from server side
console.log(objhtml);
}
});
Cette requête récupère le contenu de l'arrière-plan. Un paramètre est typesortie, ce qui peut prendre les valeurs {html, excel, csv}. Lors du retour de html pour l'affichage, je suis capable de les manipuler et de les afficher correctement. Maintenant, sur le problème...
Quand j'ai mis le typesortie paramètre au format csv ou excel, je remonte le contenu approprié csv ou tsv(excel) comme demandé. MAIS, je ne veux pas le contenu, je veux une invite à télécharger le fichier(csv ou excel). Comment puis-je avoir le navigateur auto invite l'utilisateur à télécharger le fichier au lieu de simplement récupérer le texte contenu à l'intérieur de extjs?
La Version 4.07 donc je ne peux pas utiliser n'importe 4.1 seulement les caractéristiques
OriginalL'auteur Bbb | 2012-08-02
Vous devez vous connecter pour publier un commentaire.
Il semble y avoir aucune solution impénétrable, mais il existe plusieurs approches que je voudrais essayer:
1) Utiliser un
iframe
au lieu d'un vrai XHR pour publier des données au serveur, par exemple<form action="/something" target="myiframe">
oùmyiframe
est lename
de votre iframe masqué. De cette façon, votre formulaire utiliser l'iframe (pas votre fenêtre principale) de soumettre des données à la configuration de l'URL. Votre serveur doit être mis en-tête de réponse queapplication/octet-stream
(ou certains ither type MIME des données binaires) de sorte que le navigateur déclenche le téléchargement. Dans le cas contraire (si le html retourné dans votre cas) il vous suffit de récupérer de l'iframe corps innerHTML et de l'afficher à l'utilisateur dans l'INTERFACE utilisateur. Lors de l'utilisation d'une iframe (ou une nouvelle fenêtre) au lieu de XHR ne sonne pas comme la meilleure idée, cette solution semble être la plus fiable à ce jour (et avec la meilleure prise en charge du navigateur).Ici est légèrement modifié pour exemple de Ext.forme.De base docs page:
Il y a deux paramètres clés ici (lignes marquées avec
/**/
):standardSubmit: true
config que vous transmettez à votre formulaire de lui faire faire une norme de soumettre à la place de XHR.target
paramètre de la forme du soumettre action. Cette fonction n'est pas documentée, mais vous pouvez voir qu'il est utilisé dans Ext.forme.d'action.Soumettre code source (toutes les options que vous passez à Ext.forme.De base.submit() méthode de finir comme les paramètres de la Poste.forme.d'action.* exemple.Dans l'exemple de code que j'ai mis
target: '_blank'
de démontrer qu'il fonctionne tout de suite (allez créer une nouvelle fenêtre de navigateur). Vous pouvez le remplacer par le nom de votre iframe plus tard, mais je vous suggère de d'abord tester le fonctionnement de votre formulaire s'envoie des données à un régulière nouvelle fenêtre, puis de développer une logique qui crée et transforme une iframe. Vous aurez à traiter le résultat à l'intérieur de l'iframe vous-même, la pensée. Il n'est pas difficile, voir Ext.les données.Connexion.upload() mise en œuvre comme un exemple de l'iframe de traitement.ExtJS effectivement utilise déjà le
iframe
technique pour le fichier uploads. Voir Ext.les données.Connexion et Ext.forme.champ.Champ.isFileUpload() pour avoir une idée de la façon dont il fonctionne.2) Suggéré ici: À l'aide de HTML5/Javascript pour générer et enregistrer un fichier.
Si vous ne voulez pas aller à l'iframe façon, vous pouvez essayer de générer données URI à partir des données de réponse et accédez à l'URI de déclenchement de téléchargement:
De nouveau, type mime est ici essentielle. Cela a fonctionné pour moi, il faut noter, cependant, que les navigateurs imposer une limite de taille de données Uri (256 ko est un pari sûr).
3) une Autre réponse dans ce thread liens vers FileSaver.js bibliothèque implémente l' (abandonné?) w3 spec. D'utilisation et de démonstration ici. Il utilise [BlobBuilder] pour générer un blob binaire de données qui n'est plus utilisé pour initialiser les téléchargements à l'aide de plusieurs méthodes. Bien que cette solution semble fonctionner, il utilise l'Api obsolète et ne peut pas être l'avenir.
Je NE veux embed HTML pour les champs de formulaire dans une Iframe? Si oui, alors comment dans extjs dois-je définir les valeurs des champs, puis poster le formulaire?
J'ai mis à jour point 1) dans ma réponse. Vous ne mettez pas vos champs à l'intérieur de l'iframe, vous les laisser là où ils sont en ce moment dans votre application, vous venez de configurer votre formulaire pour soumettre des données dans une iframe et à l'aide d'un régulier synchrone demande, pas XHR. Voir Ext.forme.De base.standardSubmit.
Comment distinguer entre XHR rapport régulier synchronus demande? Par opposition à l'Ext.Ajax.Demande, que serais-je utiliser pour faire la demande?
Pourriez-vous fournir un exemple de code? Je n'ai pas fait ça avant, et je dois manquer une étape. Je suis l'affichage de l'Iframe, mais comment?
OriginalL'auteur Dmitry Pashkevich
Ci-dessous est ma solution. C'est de cette façon que je l'ai actuellement en train de travailler. La réponse génère un télécharger/ouvrir une invite de commandes, basée sur une réaction de type text/csv. Notez qu'aucun iFrame ou une référence à une iframe sont nécessaires. J'ai passé beaucoup de temps accroché sur la nécessité d'une iFrame, ce qui en fait cassé ma solution. Une iFrame est pas nécessaire pour générer une invite de téléchargement. Ce qui est nécessaire est une demande(de soumission) similaire à celui-ci, avec un backend de la génération de la approprié csv avec le texte/csv en-tête de réponse.
La standardSubmit ligne est vital
When returning html to display I am able to handle and display it correctly.
). Vous auriez besoin d'un iframe pour le traitement des non-téléchargé réponse. Mais de toute façon, je vous suggère d'essayer d'abord le code sans l'iframe (avec target _blank), avant de "perdre du temps".Le target: _blank n'est pas nécessaire dans mon cas. Je l'ai mentionné dans le post initial, "Lors du retour de html pour l'affichage, je suis capable de les manipuler et de les afficher correctement." Ma question était strictement avec le déclenchement de la télécharger.
J'utilise cette approche dans un succès de rappel d'un ajax-forme. De cette façon, si la soumission de l'ajax formulaire réussit, je vais exécuter un standardSubmit à offrir les ressources stockées dans la session pour le téléchargement. Si l'ajax soumettre échoue je afficher un message d'erreur dans un panneau.
Je ne peux pas attacher un écouteur à ma méthode de soumission, que j'en ai besoin pour le nettoyage après cela exécute, avez-vous eu de la chance?
OriginalL'auteur Bbb
Vous n'avez pas besoin de créer un panneau de formulaire et de le rendre cachés dans votre extjs fichier. On peut ajouter un formulaire html et cliquez sur le bouton de extjs fichier nous pouvons envoyer le formulaire à l'aide de l'url. Cela fonctionne à la fois dans IE ainsi que les navigateurs google chrome. Ci-dessous mon code, je l'ai essayé et sa fonctionne très bien,
OriginalL'auteur Xibalban
Pour le faire fonctionner sur ExtJS 3.4:
Rappelez-vous que pour le faire fonctionner, vous devez mettre le hiddenForm dans n'importe quel conteneur (c'est à dire dans le même Poste.La fenêtre du bouton), par exemple:
OriginalL'auteur luca76