2017-07-21 25 views
0

我能夠將這個腳本放在一起,只需點擊一個按鈕即可生成ics日曆文件,但它不能在IE或Safari中使用。有沒有人能夠獲得這些ics文件下載在IE中工作?瀏覽器無法識別該文件。iCal文件下載在IE中發送錯誤

我在網上看到的關於這個問題的每個問題都有關於「添加標題」的非常不完整的答案,無論如何,至少我認爲我會推出一個可在Chrome中運行的完整html/js版本/火狐w /完整的日期對象,ISO8601轉換等。這是在一個JSP文件。

<span class="start-date">01/13/2017</span> 
<span class="end-date">01/15/2017</span> 
<span class="start-time">1 PM</span> 
<span class="end-time">3 PM</span> 
<span class="event-title">NYC</span> 
<span class="event-location">NYC</span> 

<button class="createICS"> Add to Calendar </button> 



<script> 
var currentDateTime = iso8601Format(new Date().toISOString()); 
var startDateTime = iso8601Format(new Date($('.start-date').text() + " " + $('.start-time').text()).toISOString()); 
var endDateTime = iso8601Format(new Date($('.end-date').text() + " " + $('.end-time').text()).toISOString()); 
var eventLocation = $('.event-location').text(); 
var eventTitle = $('.event-title').text(); 
var icsMSG = "BEGIN:VCALENDAR\n" + 
"VERSION:2.0\n" + 
"PRODID:-//Our Company//NONSGML v1.0//EN\n" + 
"BEGIN:VEVENT\n" + 
"DTSTAMP:" + currentDateTime + "\n" + 
"DTSTART:" + startDateTime + "\n" + 
"DTEND:" + endDateTime + "\n" + 
"LOCATION:" + eventLocation + "\n" + 
"SUMMARY:" + eventTitle + "\n" + 
"END:VEVENT\n" + 
"END:VCALENDAR"; 
console.log(icsMSG); 

$('.createICS').click(function(){ 
    window.open("data:text/calendar;charset=utf8," + encodeURIComponent(icsMSG)); 
}); 

function iso8601Format(dateTime) { // Converts date and time to the format we need: yyyyMMddThhmmssZ 
    var dT = dateTime.replace(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d{3})Z$/,'$1$2$3T$4$5$6Z'); 
    return dT; 
} 
</script> 

回答

1

看着你的代碼,你正試圖用JavaScript函數生成iCal。對於像Chrome和Firefox這樣的現代和更復雜的瀏覽器來說,這是可以的,但它不適用於IE。

IE不識別iCal文件,因爲它不是使用內容格式可以檢測到的known MIME types之一。

對於IE與iCal檔案工作,你將需要添加這隻能從服務器端進行以下響應頭:

content-type: text/calendar 
content-disposition: attachment; filename=file.ics 

雖然這是IE特定它將與Safari上也因爲它幾乎在相同的原則下工作。

JSP和Javascript

既然你已經提到的JSP,即使你寫在JSP Javascript代碼,它不會在服務器端執行,它仍然在客戶端執行。 JSP只是呈現Javascript代碼。

AEM解決方案

你或許可以改變你的邏輯在Java代碼中並呈現從JSP中的iCal文件,如果它被正確地鉤到響應流。或者,您可以編寫一個servlet來返回此iCal文件。這是因爲您需要添加響應頭並完全控制響應正文(iCal內容)才能正確呈現響應,並且這隻能從服務器端完成(至少要解決IE和Safari問題)。

更多信息

this相關細節,以便問題。

+0

在返回iCal文件的servlet中看起來像什麼?我之前沒有看到這些響應頭,不知道如何使用它們。我可以在它們上找到mozilla文檔,但是它在java/jsp中的實現並不是很有幫助 –