Télécharger fichier Excel via AJAX MVC
J'ai un grand(ish) forme en MVC.
J'ai besoin d'être en mesure de générer un fichier excel contenant des données à partir d'un sous-ensemble de la forme.
Le problème est que cela ne devrait pas affecter le reste de la forme et donc je veux le faire via AJAX. Je suis venu à travers quelques questions, AFIN que, semblent être liés, mais je ne peux pas tout à fait ce que les réponses veux dire.
Celui-ci semble le plus proche de ce que je suis après: asp net mvc-téléchargement excel - mais je ne suis pas sûr que je comprends de la réponse, et c'est un couple ans maintenant. J'ai aussi rencontré un autre article (il ne peut pas trouver plus au sujet de l'aide d'un iframe pour gérer le téléchargement du fichier, mais je ne suis pas sûr de savoir comment le faire fonctionner avec MVC.
Mon fichier excel renvoie bien si je suis en train de faire un post complet en arrière, mais je ne peux pas le faire fonctionner avec l'AJAX en mvc.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas retourner directement un fichier à télécharger via un appel AJAX donc, une approche alternative est d'utiliser un appel AJAX pour publier les données relatives à votre serveur. Vous pouvez ensuite utiliser côté serveur de code pour créer le Fichier Excel (je vous conseille d'utiliser EPPlus ou NPOI pour ce bien qu'il semble que si vous avez cette partie de travail).
Ma réponse originale à cette question (ci-dessous) a été de plus de 3 ans, j'ai donc pensé que je voudrais le mettre à jour comme je n'ai plus de créer des fichiers sur le serveur lors du téléchargement de fichiers via AJAX cependant, j'ai laissé l'original de la réplique comme il peut être de quelque utilité, toujours en fonction de vos besoins spécifiques.
Un scénario courant dans mes applications MVC est de reporting via une page web qui a une certaine configuré par l'utilisateur des paramètres de rapport (Date des Plages, des Filtres, etc.). Lorsque l'utilisateur a spécifié les paramètres de poster sur le serveur, le rapport est généré (disons par exemple un fichier Excel en sortie) et puis je stocker le fichier dans un tableau d'octets dans le
TempData
seau avec une référence unique. Cette référence est passée à l'arrière comme un Résultat Json à ma fonction AJAX qui, par la suite redirige vers contrôleur séparé d'action pour extraire les données à partir deTempData
et de téléchargement à la fin de navigateur d'utilisateurs.De donner ce plus en détail, en supposant que vous avez un MVC Vue d'un formulaire lié à un Modèle de classe, appelons le Modèle
ReportVM
.Tout d'abord, l'action d'un contrôleur est nécessaire pour recevoir posté modèle, un exemple serait:
De l'appel AJAX qui publie mon MVC formulaire ci-dessus pour le contrôleur et reçoit la réponse ressemble à ceci:
L'action du contrôleur pour gérer le téléchargement du fichier:
Un autre changement qui pourrait facilement être logés si besoin est de passer le Type MIME du fichier d'un troisième paramètre pour que le Contrôleur de l'action pourrait servir correctement une variété de formats de fichiers de sortie.
Cela supprime toute nécessité de physique des fichiers créés et stockés sur le serveur, donc pas de ménage routines nécessaires et une fois de plus c'est transparent pour l'utilisateur final.
Remarque, l'avantage de l'utilisation de
TempData
plutôt queSession
est qu'une foisTempData
est de lire les données sont effacées de sorte qu'il sera plus efficace en termes d'utilisation de la mémoire si vous avez un volume élevé de demandes de fichiers. Voir TempData Les Meilleures Pratiques.Vous ne pouvez pas retourner directement un fichier à télécharger via un appel AJAX donc, une approche alternative est d'utiliser un appel AJAX pour publier les données relatives à votre serveur. Vous pouvez ensuite utiliser côté serveur de code pour créer le Fichier Excel (je vous conseille d'utiliser EPPlus ou NPOI pour ce bien qu'il semble que si vous avez cette partie de travail).
Une fois que le fichier a été créé sur le serveur passe en arrière le chemin d'accès au fichier (ou simplement le nom de fichier) comme valeur de retour de votre appel AJAX et puis définissez le JavaScript
window.location
à cette URL, ce qui invite le navigateur à télécharger le fichier.À partir de la fin les utilisateurs point de vue, l'opération de téléchargement de fichier est transparente comme ils n'ont jamais quitter la page sur laquelle la demande émane.
Ci-dessous est un simple exemple artificiel d'un appel ajax pour réaliser ceci:
Un exemple de la méthode du contrôleur pour le Téléchargement de l'action serait:
System.Web.Mvc
et renvoie unFileContentResult
/Images/SampleImage.jpg
mais il ne fonctionne pas avec une absolue/physique/chemin d'accès complet (http://www.google.com/Images/SampleImage.jpg
).Mes 2 cents - vous n'avez pas besoin de stocker les excel un fichier physique sur le serveur au lieu, de le stocker dans la Session (Session) Cache. L'utilisation d'un unique nom généré pour votre Cache (variable qui stocke le fichier excel) - ce sera le retour de votre premier appel ajax. De cette façon, vous n'avez pas à traiter avec le fichier des problèmes d'accès, la gestion (suppression) les fichiers lorsqu'il n'est pas nécessaire, etc. et, ayant le fichier dans le Cache est plus rapide pour le récupérer.
J'ai récemment été en mesure d'accomplir ceci dans MVC (bien qu'il n'y avait pas besoin d'utiliser AJAX), sans création d'un fichier physique et j'ai pensé partager mon code:
Super simple fonction JavaScript (datatables.net cliquez sur le bouton qui déclenche ce):
C# code de Contrôleur:
Dans le ExportHelper classe j'utilise un outil 3ème partie (GemBox.Feuille de calcul) pour générer le fichier Excel et il a une sauvegarde de Flux en option. Cela étant dit, il ya un certain nombre de façons de créer des fichiers Excel qui peut facilement être écrit pour un flux de mémoire.
Dans IE, Chrome et Firefox, le navigateur vous invite à télécharger le fichier et pas de navigation réelle se produit.
J'ai utilisé la solution posté par CSL, mais je vous recommande de ne pas stocker le fichier de données de la Session au cours de la totalité de la session. En utilisant TempData le fichier de données est automatiquement supprimé après la demande suivante (qui est la requête GET pour le fichier). Vous pouvez également gérer la suppression du fichier de données de la Session en téléchargement action.
Session peut consommer beaucoup de mémoire/de l'espace selon SessionState de stockage et combien de fichiers sont exportés au cours de la session, et si vous avez de nombreux utilisateurs.
J'ai mis à jour les sérères du code côté de CSL à utiliser TempData à la place.
D'abord Créer le contrôleur d'action qui permettra de créer le Fichier Excel
puis créer le Téléchargement d'action
si vous souhaitez supprimer le fichier après l'avoir téléchargé créer cette
et enfin appel ajax de vous MVC, Razor vue
à l'aide de ClosedXML.Excel;
Ce fil m'a aidé à créer mon propre solution que je vais partager ici. J'ai été en utilisant une requête ajax au premier sans problèmes, mais il est arrivé à un point où la demande de longueur d'URL a été dépassé, j'ai donc dû passer à un POST.
Le javascript utilise JQuery téléchargement fichier plugin et se compose de 2 réussir appels. Un POST (Pour envoyer des params) et un, OBTENEZ-en pour récupérer le fichier.
Côté serveur
CSL réponse a été mise en œuvre dans un projet que je suis en train de travailler sur mais le problème que j'ai encouru était mise à l'échelle sur Azure cassé notre téléchargements de fichiers. Au lieu de cela, j'ai été capable de le faire avec un appel AJAX:
SERVEUR
CLIENT
(version modifiée de Poignée de téléchargement de fichier de l'ajax post)
Accepté la réponse n'a pas assez de travail pour moi car j'ai eu un 502 Bad Gateway résultat de l'appel ajax, même si tout semblait être de retour amende de la part du contrôleur.
Peut-être j'ai été frappé en limite avec TempData - pas sûr, mais j'ai trouvé que si j'ai utilisé IMemoryCache au lieu de TempData, il a bien fonctionné, alors voici ma version adaptée du code de la accepté de répondre:
Appel AJAX reste qu'avec la accepté de répondre (je n'ai pas fait de modifications):
L'action du contrôleur pour gérer le téléchargement du fichier:
...
Maintenant, il ya un certain code supplémentaire pour la mise en place MemoryCache...
Afin d'utiliser "_cache" j'ai injecté dans le constructeur pour le contrôleur comme suit:
Et assurez-vous d'avoir les éléments suivants dans ConfigureServices en Démarrage.cs:
Je suis en utilisant Asp.Net WebForm et juste je veux télécharger un fichier à partir du serveur de côté. Il y a beaucoup d'article mais je ne trouve pas juste de base de la réponse.
Maintenant, j'ai essayé un moyen de base et l'a obtenu.
C'est mon problème.
J'ai créer un grand nombre de bouton d'entrée dynamiquement à l'exécution. Et je tiens à ajouter chaque bouton de bouton de téléchargement de donner un unique fichier number.
Je crée chaque bouton comme ceci:
JS:
Chaque bouton appeler cette méthode ajax.
JS:
Ensuite, j'ai écrit une base simple méthode.
Je suis de la génération de ce Form_1, Form_2, Form_3.... Et je vais supprimer cette ancienne des fichiers avec un autre programme. Mais si il y a un moyen de l'envoi de tableau d'octets à télécharger le fichier comme l'utilisation de la Réponse. Je veux l'utiliser.
J'espère que ce sera utile pour tout le monde.
Sur Soumettre le formulaire