iCal文件下载在IE中发送错误

时间:2017-07-21 21:00:53

标签: javascript jquery internet-explorer safari aem

我能够将这个脚本放在一起,只需点击一下按钮即可生成日历文件,但它无法在IE或Safari中使用。有没有人能够让这些ics文件下载在IE中工作?浏览器无法识别该文件。

我在网上看到的每一个问题都有关于“添加标题”的非常不完整的答案,无论这意味着什么,所以至少我想我会推出一个完整的html / js版本,可以在Chrome /中运行Firefox具有完整的Date对象,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 个答案:

答案 0 :(得分: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 SO问题。