[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的方式來實做。