2013-12-09 40 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'); 
} 
相關問題