2009-02-19 24 views
4

應用程序通過AJAX從服務器請求KML數據。這些數據存儲在JavaScript變量中,並顯示在Google地球插件中。如何將JavaScript字符串下載爲文件

在javascript中,如何在不需要請求回到服務器的情況下提供一個鏈接來下載存儲在javascript變量(作爲字符串)中的KML數據?

此鏈接: http://forum.mootools.net/viewtopic.php?id=9728

建議使用數據URI的,但可能不會對我的需要跨越足夠瀏覽器。可能最簡單的方法就是返回服務器重新下載數據,但好奇的是,如果有人使用JavaScript來取消這個功能。

回答

3

簡答:你不能,仍然是平臺獨立的。大多數瀏覽器只是不允許JavaScript來操縱文件系統。

也就是說,你可能會得到一些非常特定於平臺的黑客攻擊。例如,IE提供了execCommand函數,您可以使用它來調用SaveAs。如果你在一個有你想保存的數據的IFrame中做這件事,你可能會得到它的工作 - 但只在IE瀏覽器。其他選項(再次,我要在此處具體介紹Microsoft)包括this Silverlight hack或ActiveX控件。

我認爲,爲了獲得完整的平臺兼容性,您只需要將其吸收並提供服務器端下載選項。

[編輯] 哎呀!當我去找鏈接時,我沒有做足夠的盡職調查。事實證明,我鏈接到的Silverlight黑客有一個服務器端組件。看起來你很漂亮SOL。

[編輯2] 我發現了execCommand here的瀏覽器兼容性的一個很好的總結。雖然它列出了「saveas」命令的問號,但也許這對你來說可能是一條好路線。值得一試,也許?那麼,我決定做一個我建議的方法的概念證明,並且我在IE中獲得了相當簡單的工作。不幸的是,我在這個過程中證明了這種方法will not work for Firefox,並且在Chrome/Safari中似乎也不起作用。所以它非常依賴於平臺。但它的作品!這裏有一個完整的工作頁面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
    <title>Javascript File Saver</title> 
    <script type="text/javascript"> 
     function PageLoad() { 
     var fdoc = window.frames["Frame"].document; 
     fdoc.body.appendChild(fdoc.createTextNode("foo,bar,baz")); 
     } 
     function Save() { 
     var fdoc = window.frames["Frame"].document; 
     fdoc.execCommand("SaveAs", true); 
     } 
    </script> 
</head> 
<body onload="PageLoad();"> 
<h2>Javascript File Saver</h2> 
<iframe id="Frame" style="width: 400px;">Noframe</iframe><br /> 
<button onclick="Save();">Save</button> 
</body> 
</html> 
+0

但是,在Firefox中,您可以使用MIME類型爲`application/octet-stream`的數據URL。這種MIME類型基本上意味着「二進制」,Firefox唯一能做的就是提供另存爲對話框。 但是,Chrome仍然存在。 – panzi 2010-08-28 16:06:54

+0

@panzi:感謝您的輸入。只要我有機會,我會盡力檢查出來。 – Randolpho 2010-08-28 19:46:48

0

坦率地說,我不認爲這是可能的。它從來沒有打算,這可以在JavaScript中完成。

2

是的,我怕你必須把它傳回服務器。製作一個通用的「回聲」腳本,將任何參數提供給它。

至少你可以強制使用正確的MIME類型下載:

"content-disposition","attachment; filename=data.xml" 
1

也許這將是有用的(JSP變體):

private void printSaveStringButton(String fileName, String content) throws Exception { 
     //add new invisible container with write/save functions 
     out.println("<iframe id=\"xmlContentId\" style=\"display:none;\"></iframe>"); 
     //save string in js variable 
     String jScript = "\n" + 
       "var SaveHelper = {\n" + 
       " content : null,\n" + 
       " saveContent : function(filename, text) {\n" + 
       "  text=(SaveHelper.content!=null)?SaveHelper.content:text;\n" + 
       "  var doc = document.getElementById('xmlContentId').contentWindow.document;\n" + 
       "  doc.write(text);\n" + 
       "  doc.execCommand(\"saveAs\",true,filename);\n" + 
       "  doc.close();\n" + 
       " }\n" + 
       "};\n" + 
       "SaveHelper.content = '" + org.apache.commons.lang.StringEscapeUtils.escapeJavaScript(content) + "';\n"; 
     out.println("<script type=\"text/javascript\">" + jScript + "</script>"); 
     //add button that writes content into iframe container and show save dialog. 
     out.println("<button type=\"button\" onclick=\"SaveHelper.saveContent('"+fileName+"')\">Save as...</button>"); 
    } 
2

您可能要檢查了這一點:它是稱爲Downloadify。它使用Javascript和Flash的混合,並且可以以任何格式保存字符串。嘗試一下demo,親眼看看!

相關問題