Comment créer un fichier en mémoire puis l’envoyer à l’utilisateur via asp.net mvc + jquery?

J’utilise la bibliothèque de calendriers Dday et je souhaite exporter les calendriers des utilisateurs. J’utilise donc Dday pour prendre tous les enregistrements des utilisateurs et les rendre au format ical (.ics).

Maintenant, je veux prendre ceci et le renvoyer à l’utilisateur. Cependant, je ne souhaite vraiment pas d’abord générer un fichier sur le serveur, puis le leur envoyer. Si je peux, je préfère le faire en mémoire et le leur envoyer.

Cependant, si le travail est long, je choisirai un moyen de l’enregistrer sur le serveur, ce qui permettra à l’utilisateur de le télécharger, puis de le supprimer une fois le téléchargement terminé (je ne souhaite pas que le fichier soit sur mon serveur quelques minutes).

Je ne sais pas non plus comment le renvoyer aux utilisateurs. Je préfère toujours faire une publication ajax sur le serveur avec jquery, puis, d’une manière ou d’une autre, faire revenir le fichier et afficher une fenêtre contextuelle pour l’utilisateur.

Encore une fois, si cela représente beaucoup de travail, je vais me contenter de quelque chose côté serveur qui asp.net mvc gère tout.

Mais je ne sais pas comment faire de toute façon.

Alors, comment puis-je faire cela?

Vous devez renvoyer le type FileStreamResult avec MVC

public FileStreamResult MyFunction(/*your parms*/) { System.IO.MemoryStream stream = FunctionThatCreatesMyCalendarStream(); //you may need stream.Position = 0 here depending on what state above funciton leaves the stream in. //stream.Position = 0; FileStreamResult result = new FileStreamResult(stream, "text/calendar"); result.FileDownloadName = "myfiledownloadname.ics"; return result; } 

Vous avez besoin d’un gestionnaire côté serveur, qui générera les données, définira HttpResponse.ContentType sur le type MIME correspondant, puis vous devrez écrire les données sur HttpResponse.ResponseStream ou utiliser la méthode HttpResponse.Write .

Exemple (CalendarHandler.ashx):

 public class CalendarHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/calendar"; var calendarData = @" BEGIN:VEVENT UID:[email protected] DTSTAMP:19970901T1300Z DTSTART:19970401T163000Z DTEND:19970402T010000Z SUMMARY:Laurel is in sensitivity awareness class. CLASS:PUBLIC CATEGORIES:BUSINESS,HUMAN RESOURCES TRANSP:TRANSPARENT END:VEVENT"; context.Response.Write(calendarData); } } 

Maintenant, il vous suffira de faire une demande à CalcHandler.ashx en utilisant ajax ou en utilisant des méthodes conventionnelles.

Note: Je ne sais pas si c’est une donnée candelar valide, je viens de prendre un exemple aléatoire tiré de RFC http://tools.ietf.org/html/rfc2445

Si vous faites cela, vous n’auriez pas besoin de créer un fichier à tout moment.

Vous pouvez utiliser votre propre résultat d’action: (Vous ne savez pas ce que DCal fait pour le faire ici)

 public class DCalResult : ActionResult { private readonly ISomeDCalInterface _dcalObject; public DCalResult(ISomeDCalInterface dcalObject) { _dcalObject = dcalObject; } public override void ExecuteResult(ControllerContext context) { var response = context.HttpContext.Response; response.ClearHeaders(); response.ContentType = "text/calendar"; response.Write(_dcalObject.ToSsortingng()); } } 

Ensuite, dans l’action de votre contrôleur, retournez ceci:

 public ActionResult DCal() { return new DCalResult(usersDcalObject); }