如何将JavaScript字符串下载为文件

时间:2009-02-19 20:05:11

标签: javascript ajax file-io

应用程序通过服务器的AJAX请求KML数据。此数据存储在javascript变量中,并显示在Google地球插件中。

在javascript中,我如何提供一个链接来下载存储在javascript变量中的KML数据(作为字符串)而不需要请求回服务器?

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

建议使用数据URI,但这可能无法满足我的需求。可能最简单的只是回到服务器再次获取数据下载,但好奇是否有人用javascript取消了这个。

8 个答案:

答案 0 :(得分:3)

简短的回答:你不能并且仍然是平台独立的。大多数浏览器都不允许javascript操纵文件系统。

那就是说,你可能能够摆脱一些特定于平台的黑客攻击。例如,IE提供了execCommand函数,您可以使用它来调用SaveAs。如果您在拥有要保存的数据的IFrame中执行此操作,则可能会使其正常工作 - 但仅限于IE。其他选项(再次,我将在这里特定的Microsoft)包括this Silverlight hack或ActiveX控件。

我认为对于完全平台兼容性,您只需要将其搞砸并提供服务器端下载选项。

[编辑] 哎呦!当我去寻找链接时,我没有做足够的尽职调查。事实证明,我链接的Silverlight hack有一个服务器端组件。看起来你很漂亮。

[EDIT2] 我发现了execCommand here的浏览器兼容性的一个很好的总结。虽然它列出了“saveas”命令的问号,但也许这对你来说可能是一条好路线。值得一试,也许吧?

[EDIT3] 好吧,我决定对我建议的方法做一个概念验证,我在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>

答案 1 :(得分:2)

是的,我担心你必须把它传回服务器。制作一个通用的“echo”脚本,它会输出任何输入它的参数。

至少可以使用正确的MIME类型强制下载:

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

答案 2 :(得分:2)

您可能想要检查一下:它叫做Downloadify。它使用Javascript和Flash的混合,并且可以以几乎任何格式保存字符串。试试demo,亲眼看看!

答案 3 :(得分:2)

查看http://regany.com/blog/2014/05/30/convert-a-string-to-a-download-file-in-javascript/

启用弹出窗口并使用以下代码:

var str = "the string you wan't to download";
window.open('data:text/plain,' + encodeURIComponent(str));

答案 4 :(得分: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>");
    }

答案 5 :(得分:1)

您可以使用parseKml函数来解析javascript变量中的kml数据,而不是尝试将其存储在文件中并从javascript中修改它(由于安全原因我不认为这是可能的)

https://developers.google.com/earth/documentation/kml

答案 6 :(得分:0)

坦率地说,我不认为这是可能的。它从来没有打算在javascript中完成。

答案 7 :(得分:0)

这将起作用!这个对我有用。

enter link description here

`function download(filename, text) {
  var element = document.createElement('a');
  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  element.setAttribute('download', filename);

  element.style.display = 'none';
  document.body.appendChild(element);

  element.click();

  document.body.removeChild(element);
}

// Start file download.
download('hello.txt','This is the content of my file ');

`