2012-04-18 290 views
1

我正在开发导出日历的应用程序。我的问题是日历下载而不是用Outlook打开。这里是我的代码:从浏览器中打开.ics文件

1)在主网页的图片导出链接日历:

<img src="/calendar.png" width="32" Style="width: 32px; height:32px;" title="Calendar" onClick="javascript:document.getElementById('exportCal').submit();"> 

<form id="exportCal" action="Calendar.jsp" target="_blank" method="post"> 
    <INPUT TYPE="hidden" ID="calendarData" NAME="calendarData" VALUE=""/> 
</form> 

2)在该链接重定向到JSP,我产生的.ics(使用iCal4j库)文件并将其附加到响应中:

response.setHeader ("Content-Disposition", "inline;filename=\"mycalendar.ics\""); 
response.setContentType("text/calendar"); 

Calendar calendar = new Calendar(); 
calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN")); 
calendar.getProperties().add(Version.VERSION_2_0); 
calendar.getProperties().add(CalScale.GREGORIAN); 

java.util.Calendar cal = java.util.Calendar.getInstance(); 
cal.set(java.util.Calendar.MONTH, java.util.Calendar.DECEMBER); 
cal.set(java.util.Calendar.DAY_OF_MONTH, 25); 

// initialise as an all-day event.. 
VEvent christmas = new VEvent(new Date(cal.getTime()), "Christmas Day"); 

// Generate a UID for the event.. 
UidGenerator ug = new UidGenerator("1"); 
christmas.getProperties().add(ug.generateUid()); 

calendar.getComponents().add(christmas); 
System.out.println(calendar); 

ServletOutputStream fout = response.getOutputStream(); 

CalendarOutputter outputter = new CalendarOutputter(); 
outputter.output(calendar, fout); 

fout.flush(); 

然后下载.ics文件。但我真正想做的是用Outlook打开它。有没有办法做到这一点?

在此先感谢!

回答

1

这似乎是一个浏览器特定的行为。避免自动下载的唯一方法是使用webcal协议as suggested in this SO post(铬合金中的)。 Webcal通常仅用于动态日历订阅 - 不是静态日历项目。如果您在下载后打开ICS - 它应该在Outlook中打开。

<p>A <a href="webcal://mycalendar.ics">webcal ics link</a></p> 
+0

我知道webcal协议,但我认为它只适用于静态文件。因为为了放置这样的链接,您应该先创建(并存储)该文件,然后链接到该文件。因此,每次打开包含链接的页面时,都会生成新的日历文件(每个用户都不相同),可能会或可能不会下载。另外,我已经尝试过这种解决方案,但我不知道如何将文件保存在服务器中,以便以后可以下载。如果我错了,请纠正我,并指出我正确的方向,因为我是一个jsp新手。非常感谢!! – Neets 2012-04-19 05:39:54