使用 javascript 或 jquery 创建 .ics 文件

问题描述 投票:0回答:6

我试图在用户单击按钮时创建一个

.ics
文件。

到目前为止我拥有的代码是

msgData1 = $('.start-time').text();
msgData2 = $('.end-time').text();
msgData3 = $('.Location').text();

var icsMSG = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Our Company//NONSGML v1.0//EN\nBEGIN:VEVENT\nUID:[email protected]\nDTSTAMP:20120315T170000Z\nATTENDEE;CN=My Self ;RSVP=TRUE:MAILTO:[email protected]\nORGANIZER;CN=Me:MAILTO::[email protected]\nDTSTART:" + msgData1 +"\nDTEND:" + msgData2 +"\nLOCATION:" + msgData3 + "\nSUMMARY:Our Meeting Office\nEND:VEVENT\nEND:VCALENDAR";

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

这会下载一个

.ics
文件,但是当我尝试在 iCal 中打开它时,我被告知它无法读取该文件。

javascript jquery icalendar
6个回答
29
投票

我使用了 InsanelyADHD 提到的 ics.js 解决方案。

该解决方案的一个问题是 Chrome 无法正确检测文件类型,并尝试使用编辑器以文本形式打开文件。

我更改了下载功能,只需使用以下命令即可打开文本:

window.open( "data:text/calendar;charset=utf8," + escape(calendar));

我在 Github 上的分支是 icsFormatter.js

关于许可证:我已联系原作者以包含 GPL - 之后我也会包含一个。


10
投票

有一个开源项目:

它是 100% JavaScript,适用于除 IE 9 及更低版本之外的所有现代浏览器。

如果您对他们如何使文件正常工作感兴趣,您可以检查他们的来源。 他们使用以下库来执行繁重的工作:


4
投票

组织者地址有两个冒号:“MAILTO::[电子邮件受保护]

如果这不能解决问题,您必须向我们展示 iCal 收到的完整的 ical 流。

最后,假设 start_time 和 end_time 使用正确的格式,对于位置字段,您可能需要换行(https://www.rfc-editor.org/rfc/rfc5545#section-3.1)和转义某些字符(https://www.rfc-editor.org/rfc/rfc5545#section-3.3.11)。换句话说,您可能想查看 iCalendar 库。


2
投票

ics.js 对我不起作用,因为我是从数据库异步加载数据的。然后我切换到 ical.js 并结合 ics.js 中的 saveAs 函数,它起作用了。如果这里有人遇到同样的问题,请随时给我发短信,我会提供一个例子


0
投票

我使用了 smartbart24 提到的 icsFormatter。但我需要支持 IE 版本 7,所以我不得不稍微调整一下。

要使用 icsGen(我的 icsFormatter 分支),您必须在网络服务器上安装 php 4 或 5。


0
投票

这是 Codepen 上的一个很好的例子。 基本上这个功能:

function convertDate(date) {
  var event = new Date(date).toISOString();
  event = event.split("T")[0];
  event = event.split("-");
  event = event.join("");
  return event;
}
function makeIcsFile(date, summary, description) {
  var test =
    "BEGIN:VCALENDAR\n" +
    "CALSCALE:GREGORIAN\n" +
    "METHOD:PUBLISH\n" +
    "PRODID:-//Test Cal//EN\n" +
    "VERSION:2.0\n" +
    "BEGIN:VEVENT\n" +
    "UID:test-1\n" +
    "DTSTART;VALUE=DATE:" +
    convertDate(date.start) +
    "\n" +
    "DTEND;VALUE=DATE:" +
    convertDate(date.end) +
    "\n" +
    "SUMMARY:" +
    summary +
    "\n" +
    "DESCRIPTION:" +
    description +
    "\n" +
    "END:VEVENT\n" +
    "END:VCALENDAR";

  var data = new File([test], { type: "text/plain" });

  // If we are replacing a previously generated file we need to
  // manually revoke the object URL to avoid memory leaks.
  if (icsFile !== null) {
    window.URL.revokeObjectURL(icsFile);
  }

  icsFile = window.URL.createObjectURL(data);

  return icsFile;
}
© www.soinside.com 2019 - 2024. All rights reserved.