[WEB API]匯出ics檔案,使用ical.net

[WEB API]匯出ics檔案,使用ical.net

前言

何謂ics呢?可能很多人都不清楚這是什麼東西,簡而言之這個是outlook吃的一種檔案,可以直接吃進行事曆裡面,這也是之前實做的一個需求,筆者試圖紀錄下來後發現,筆者之前使用的是DDay.iCal,不過現在已經改版並建立了github了,改名稱之為ical.net,使用方式不太一樣,但差異性也不是那麼的大,有需要的讀者也可以直接參訪github位址(https://github.com/rianjs/ical.net)

開始動手實作

首先安裝一下ical.net吧,可以看到第二個就是DDay.iCal,而且安裝數量更加的多,其實當你在google的時候,應該可以發現更多是針對DDay.iCal做介紹的文章,不過未來官方都會維護Ical.net這個專案,而且官方文件應該也都會有最新的更新,所以我目前選擇的是Ical.net,然後也把之前的範例改過來。

接著就開始寫程式碼了,以筆者習慣來說,在程式碼裡面寫註解,會比較容易理解,所以更多我認為比較不好懂的說明,皆會寫在註解裡面

    public class CalController : ApiController
    {
        public HttpResponseMessage Get()
        {
            ICalendar iCal = new Calendar();
            Event evt = iCal.Create<Event>(); //這是一個泛型,而Event是Ical提供的一個類別
            evt.DtStart = new CalDateTime(DateTime.Today);
            SetEndDate(evt); //設定結束日期或者設定下面註解那行的無結束日期,擇其一
            //SetRecurrenceEnd(evt); 
            evt.Description = "測試ICal,並紀綠下這篇文章";
            evt.Summary = "測試ICal";
            evt.Location = "台北市";
            //evt.IsAllDay = true; //如果設定無結束日期,此設定無效,如果設定全天,不是無結束日期的,那設定的結束時間也無效
            CalendarSerializer serializer = new CalendarSerializer();
            string output = serializer.SerializeToString(iCal);
            var response = new HttpResponseMessage(HttpStatusCode.OK);
            response.Content = new StringContent(output);
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/calendar");
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
            response.Content.Headers.ContentDisposition.FileName = HttpUtility.UrlPathEncode($"ical{DateTime.Now}.ics");
            response.Content.Headers.ContentLength = output.Length;
            return response;
        }

        private void SetEndDate(Event evt)
        {
            evt.DtEnd = new CalDateTime(DateTime.Today.AddHours(6));
        }

        private void SetRecurrenceEnd(Event evt)
        {
            var rule = new RecurrencePattern(FrequencyType.Daily);
            evt.RecurrenceRules = new List<IRecurrencePattern> { rule };
        }
    }


結論

這篇也是簡單紀錄一下,如果各位剛好有這個需求的話,或許這篇也能幫助到你,並且使用web api的方式來實做。