Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JavaScript字符串下载为文件_Javascript_Ajax_File Io - Fatal编程技术网

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

如何将JavaScript字符串下载为文件,javascript,ajax,file-io,Javascript,Ajax,File Io,应用程序通过AJAX从服务器请求KML数据。这些数据存储在javascript变量中,并显示在Google Earth插件中 在javascript中,我如何提供一个链接来下载存储在javascript变量(作为字符串)中的KML数据,而无需请求返回服务器 此链接: 建议使用数据URI,但这可能无法在足够多的浏览器中满足我的需要。可能最简单的方法就是返回服务器再次获取数据以供下载,但很好奇是否有人用javascript实现了这一点。坦率地说,我认为这是不可能的。我们从来没有打算用javascr

应用程序通过AJAX从服务器请求KML数据。这些数据存储在javascript变量中,并显示在Google Earth插件中

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

此链接:


建议使用数据URI,但这可能无法在足够多的浏览器中满足我的需要。可能最简单的方法就是返回服务器再次获取数据以供下载,但很好奇是否有人用javascript实现了这一点。

坦率地说,我认为这是不可能的。我们从来没有打算用javascript实现这一点。

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

这就是说,您可能能够通过一些非常特定于平台的黑客行为逃脱惩罚。例如,IE提供了execCommand函数,您可以使用它调用SaveAs。如果您在包含要保存的数据的IFrame中执行此操作,则可能会使其正常工作,但仅限于IE。其他选项(这里我要再次说明的是特定于Microsoft的)包括,或ActiveX控件

我认为为了实现完全的平台兼容性,您只需要接受它并提供服务器端下载选项

[编辑] 哎呀!我在寻找链接时没有做足够的尽职调查。我链接的Silverlight黑客有一个服务器端组件。看起来你很漂亮,索尔

[编辑二] 我发现了execCommand浏览器兼容性的一个很好的总结。虽然它列出了“saveas”命令的问号,但这毕竟可能是一个不错的方法。也许值得一试

[编辑部3] 嗯,我决定对我建议的方法进行概念验证,我在IE中得到了一些相当简单的东西。不幸的是,我在这个过程中证明了这种方法,而且在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>

Javascript文件保护程序
函数PageLoad(){
var fdoc=window.frames[“Frame”].document;
fdoc.body.appendChild(fdoc.createTextNode(“foo,bar,baz”);
}
函数Save(){
var fdoc=window.frames[“Frame”].document;
fdoc.execCommand(“SaveAs”,true);
}
Javascript文件保护程序
Noframe
拯救
是的,恐怕您必须将其传回服务器。制作一个通用的“echo”脚本,该脚本将输出输入到它的任何参数

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

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

可能会有用(JSP变体):

private void printSaveStringButton(字符串文件名、字符串内容)引发异常{
//添加具有写入/保存功能的新不可见容器
out.println(“”);
//在js变量中保存字符串
字符串jScript=“\n”+
“var SaveHelper={\n”+
内容:空,\n+
saveContent:函数(文件名,文本){\n+
“text=(SaveHelper.content!=null)?SaveHelper.content:text;\n”+
“var doc=document.getElementById('xmlContentId').contentWindow.document;\n”+
“文件写入(文本);\n”+
doc.execCommand(\'saveAs\,true,文件名);\n+
“doc.close();\n”+
“}\n”+
“};\n”+
“SaveHelper.content=”+org.apache.commons.lang.StringEscapeUtils.escapeJavaScript(内容)+“;\n”;
out.println(“+jScript+”);
//添加将内容写入iframe容器并显示保存对话框的按钮。
out.println(“另存为…”);
}

您可能想检查一下:它被称为。它混合使用Javascript和Flash,可以以几乎任何格式保存字符串。试一试,亲自看看

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

退房

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

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

这会有用的!它对我有用

`函数下载(文件名、文本){
var-element=document.createElement('a');
element.setAttribute('href','data:text/plain;charset=utf-8',+encodeURIComponent(text));
setAttribute('download',filename);
element.style.display='none';
document.body.appendChild(元素);
元素。单击();
document.body.removeChild(元素);
}
//开始文件下载。
下载('hello.txt','This the content of my file');

`
但在Firefox中,您可以使用mime类型的数据URL
应用程序/octet流
。这种mime类型基本上意味着“二进制”,Firefox使用这种类型唯一能做的就是提供一个“另存为”对话框。不过,我仍然缺少Chrome。@panzi:谢谢您的输入。一旦有机会,我会尝试检查。我喜欢这个解决方案,但它会让应用程序面临巨大的安全漏洞吗?请包括相关内容,而不是场外链接,因为链接内容可能会更改并过时。按预期工作
var str = "the string you wan't to download";
window.open('data:text/plain,' + encodeURIComponent(str));