Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FileResult with MemoryStream gives empty result .. what's the problem?

Tags:

c#

asp.net-mvc

I'm generating ics files ( iCalendar or RFC 2445 or however you call them) using a library that serializes the ical contents into a MemoryStream, or actually any type of stream.

Here's my chunk of code:

    public ActionResult iCal(int id) {

        MyApp.Event kiEvt = evR.Get(id);

        // Create a new iCalendar
        iCalendar iCal = new iCalendar();

        // Create the event, and add it to the iCalendar
        DDay.iCal.Components.Event evt = iCal.Create<DDay.iCal.Components.Event>();

        // Set information about the event
        evt.Start = kiEvt.event_date;
        evt.End = evt.Start.AddHours(kiEvt.event_duration); // This also sets the duration            
        evt.Description = kiEvt.description;
        evt.Location = kiEvt.place;
        evt.Summary = kiEvt.title;

        // Serialize (save) the iCalendar
        iCalendarSerializer serializer = new iCalendarSerializer(iCal);


        System.IO.MemoryStream fs = new System.IO.MemoryStream();

        serializer.Serialize(fs, System.Text.Encoding.UTF8);

        return File(fs, "text/calendar", "MyApp.wyd."+kiEvt.id+".ics");
    }

My problem is that fs contains some content, but the controller returns empty file - with proper mimetype and filename. I'm most probably missing something with the stream handling but can't figure out what.

Can anybody help me out here? Thanks in advance.

like image 697
Michal Rogozinski Avatar asked May 26 '09 02:05

Michal Rogozinski


2 Answers

Just a guess: Do you need to Seek back to the start of the stream before you return it?

fs.Seek(0, 0);
like image 91
Matt Hamilton Avatar answered Oct 09 '22 01:10

Matt Hamilton


iCalendar iCal = new iCalendar();
foreach (CalendarItem item in _db.CalendarItems.Where(r => r.Start > DateTime.Now && r.Active == true && r.CalendarID == ID).ToList())
{
    Event evt = new Event();
    evt.Start = new iCalDateTime(item.Start);
    evt.End = new iCalDateTime(item.End);
    evt.Summary = "Some title";
    evt.IsAllDay = false;
    evt.Duration = (item.End - item.Start).Duration();
    iCal.Events.Add(evt);
}
// Create a serialization context and serializer factory. 
// These will be used to build the serializer for our object. 
ISerializationContext ctx = new SerializationContext();
ISerializerFactory factory = new DDay.iCal.Serialization.iCalendar.SerializerFactory();
// Get a serializer for our object
IStringSerializer serializer = factory.Build(iCal.GetType(), ctx) as IStringSerializer;
if (serializer == null) return Content("");
string output = serializer.SerializeToString(iCal);
var contentType = "text/calendar";
var bytes = Encoding.UTF8.GetBytes(output);
var result = new FileContentResult(bytes, contentType);
result.FileDownloadName = "FileName.ics";
return result;
like image 23
andreydruz Avatar answered Oct 09 '22 01:10

andreydruz