2010-11-17 103 views
4

我試圖在JavaScript中設置一個打包的web應用程序的導出功能,將存儲在localStorage中的字符串轉換爲純文本文件進行下載。由於JavaScript無法訪問計算機的文件系統,因此我想設置它以便它創建一個空白文本文件(或者,如果失敗,則是一個簡單的HTML頁面)並在Web瀏覽器中打開;因爲它不會訪問任何文件系統,我希望這是可能的。使用JavaScript創建導出功能?

我想使用數據URI方案打開localStorage的純文本,如下面的:

function exportFile() { 
window.open("data:text/plain;charset=utf-8," + localStorage.WebAppData); 
}; 

但它比我預想的要慢得多,這是我的猜測是因爲它堅持全文檔在URL框中。雖然可能不是代碼問題,但某些網絡瀏覽器(如Google Chrome)不會讓我保存生成的文件。 (因爲某些原因,所有的換行符都變成了空格......)

任何建議來解決這些問題或更好的方式來做類似的功能將不勝感激!

回答

2

你嘗試類似:

window.open("data:text/plain;charset=utf-8," + localStorage.WebAppData); 

對於下載,我猜你需要往返到服務器時,將設置一個MIME /類型,這將使​​下載框彈出。

編輯
如果使用localStorage,可能是window.postMessage是在你的環境中可用,並可能有助於速度。

+0

謝謝。這解決了這個問題,但仍然有一些我想解決的問題。我已經更新了適合的問題。 – 2010-11-17 11:18:16

0

不是一個真正的解決方案,而不是一個變通辦法,但你的問題,並通過@Mic的回答使我沿着這條路:

只需使用data:text/html的,那麼你可以把換行符使用<br />

  1. 我嘗試了一切(unicode字符等的所有組合)來獲取text/plain中的換行符,但無法讓它們顯示出來。 document.write()document.body.textContent()等也遭受同樣的問題。換行符會被忽略。
  2. 由於Chrome不會讓您保存彈出窗口無論如何,讓文字在它外面是複製和粘貼的唯一途徑,所以沒有使用的好處text/plain超過text/html
  3. 在Web瀏覽器,可以讓您保存頁面(Firefox)可以選擇將頁面保存爲文本而不是HTML,因此您仍然可以獲得相同的最終結果。

編輯:這種方法適用於Chrome瀏覽器,而不是Firefox的

win = window.open("", "win") 
win.document.body.innerText = "Line \n breaks?" 

不得不使用innerText雖然。 InnerHTMLtextContent刪除換行符。這對兩個作品:

win = window.open("", "win") 
win.document.body.innerHTML = "<pre>Line \n breaks?</pre>" 

所以也許你可以把所有東西都包裹在<pre>標籤?雖然我猜這兩個問題都與「
」的建議有相同的「問題」,因爲它實際上是在創建一個HTML文檔,而不是文本/普通文檔。

1

爲了保持與window.open可以將您的數據包與是encodeURI導出的數據線遊:

var data1 = "Line \n break. And \r\n another one"; 
window.open("data:application/octet-stream, " + encodeURI(data1)); 

否則,你可以與BTOA功能導出base64編碼數據:

var data1 = "Line \n break. And \r\n another one"; 
window.open("data:application/octet-stream;base64, " + btoa(data1));