2010-01-08 3 views
2

J'utilise la bibliothèque de calendrier Dday et je veux exporter les calendriers des utilisateurs. J'utilise donc le Dday pour prendre tous les enregistrements des utilisateurs et les convertir en format ical (.ics).Comment créer un fichier en mémoire puis envoyer le fichier à l'utilisateur via asp.net mvc + jquery?

Maintenant, je veux prendre ceci et le renvoyer à l'utilisateur. Cependant, je ne veux vraiment pas d'abord générer un fichier sur le serveur puis l'envoyer à eux. Si je peux, je préfère le faire en mémoire et le leur envoyer. Si elle est cependant beaucoup de travail je vais me contenter d'un moyen qui l'enregistre sur le serveur permet à l'utilisateur de le télécharger, puis le supprime après avoir fini de le télécharger (je ne veux pas que le fichier soit sur mon serveur pendant plus de quelques minutes).

Je ne suis pas sûr non plus comment renvoyer les utilisateurs. Je préfère toujours faire un post ajax sur le serveur avec jquery puis en quelque sorte avoir le fichier revenir et popup pour l'utilisateur.

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

Mais je ne sais pas comment faire.

Alors, comment puis-je faire cela?

Répondre

2

Vous devez retourner 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; 
} 
+0

Je ne pense pas jquery bien que je sais comment le rendre comme un fichier si – chobo2

+0

de votre appel à une nouvelle fenêtre du navigateur. jquery peut le faire, et cela fonctionne. Voilà comment je le fais. –

+0
0

Vous avez besoin d'un gestionnaire côté serveur, qui va générer les données, réglez le HttpResponse.ContentType le type MIME correspondant et vous aurez besoin d'écrire les données sur la méthode HttpResponse.ResponseStream ou utiliser 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, vous aurez seulement besoin de faire une demande de CalcHandler.ashx en utilisant ajax ou en utilisant des méthodes conventionnelles.

Note: Je ne sais pas si c'est une donnée de candelar valides, je viens de prendre un exemple au hasard de la RFC http://tools.ietf.org/html/rfc2445

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

+0

Bonjour Dday retourne un flux comment j'écris le flux. Je ne vois rien dans le contexte. Réponse. – chobo2

+0

var cd = new ContentDisposition { Inline = false, FileName = "fichier.ics" }; Response.AppendHeader ("Content-Disposition", cd.ToString()); – MarkKGreenway

+0

@ chobo2 dites-moi quelle méthode utilisez-vous pour obtenir le flux du calendrier en utilisant la documentation: http://www.ddaysoftware.com/Pages/Projects/DDay.iCal/Documentation/ et je vais vous dire exactement comment écrire le sream retour au client. – albertein

0

Vous pouvez utiliser votre propre résultat de l'action: (Vous avez aucune idée de ce que DCAL ne sorte en fait 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.ToString()); 
    } 
} 

Ensuite, dans votre action des contrôleurs retour que:

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