2009-02-19 27 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,亲眼看看!

相关问题