2013-12-09 44 views
1

需要围绕在Javascript应用程序中处理简单文件下载(.ics)的选项提供建议。在简单的客户端应用程序中处理文件

假设s.icsMsg是一个好格式的文本/日历字符串,下面的工作在Chrome:

var downloadLink = document.createElement("a"); 
downloadLink.href = 'data:text/calendar;charset=utf-8,' + s.icsMsg; 
downloadLink.download = "Calendar.ics"; 
document.body.appendChild(downloadLink); 
downloadLink.click(); 
document.body.removeChild(downloadLink); 

文件下载,正确命名并打开到邮件客户端。在IE 9+中,我得到一个数据区大小错误。

在IE中,纯粹在客户端上有没有办法实现这一点?我知道我可以通过在http头中设置内容处理来实现,但由于该文件是在客户端生成的,因此需要两个额外的跃点才能将其推出,保存起来,然后使用正确的标头将其发回(如果那甚至会起作用)。

任何建议将是伟大的...

+0

想一想,但你有没有想过打开一个iframe的数据发布到它的iframe页面基本上只是把数据发布到它的内容处置标题? –

+0

没想到这是可能的?我以为服务器上设置了标题,因为我都是客户端,所以没有发生。虽然,我不知道是否可以在同一页面上做ajax文章,在帖子中设置标题并在其中添加魔法...另一种方法是在App Harbor或类似软件上托管的简单服务,然后在Google云端硬盘中创建该文件,并返回我然后.click()的网址。也许。或者IE可能会有一个可怕的倒退。 – Nathan

+0

标头设置在服务器端。但在我考虑的情况下是将数据“POST”到服务器。因此,服务器将有权访问客户端生成的数据(在php的'$ _POST'字段中),然后可以将这些数据放入标题中 –

回答

0

找到了解决方案。在IE10/11中工作正常,任何更早的我只是没有显示触发此功能的链接。想象中的大多数用户将会在移动设备上,因此旧IE不会成为问题。

对非IE浏览器使用window.open(),但找不到如何设置文件名。虽然没有阶段性,但一切都在起作用。

if (!s.isIE) { 
    var downloadLink = document.createElement("a"); 
    downloadLink.href = 'data:text/calendar;charset=utf-8,\r\n' + escape(s.icsMsg); 
    downloadLink.download = "Calendar.ics"; 
    document.body.appendChild(downloadLink); 
    downloadLink.click(); 
    document.body.removeChild(downloadLink); 
} 
else { 
    var blob = new Blob([s.icsMsg]); 
    window.navigator.msSaveOrOpenBlob(blob, 'Calendar.ics'); 
} 
相关问题