从JavaScript字符串保存文件而不点击服务器

从JavaScript字符串保存文件而不点击服务器,javascript,silverlight,Javascript,Silverlight,如果我在JavaScript中有一个内存字符串,比如Excel或PDF格式,我想弹出一个保存对话框,这样用户就可以将这些字节保存到一个文件中,我该怎么做呢?我试图避免返回服务器。如果我返回服务器,我可以在响应中发送正确的HTTP头,告诉浏览器我正在发送文件。但是我想用JavaScript来实现这一点,因为我已经在客户端上拥有了所需的字节 这可能吗 编辑: 我应该澄清一下我到底在找什么。我正在使用Silverlight应用程序。在Silverlight中,我可以弹出一个保存对话框并保存字节(在本例

如果我在JavaScript中有一个内存字符串,比如Excel或PDF格式,我想弹出一个保存对话框,这样用户就可以将这些字节保存到一个文件中,我该怎么做呢?我试图避免返回服务器。如果我返回服务器,我可以在响应中发送正确的HTTP头,告诉浏览器我正在发送文件。但是我想用JavaScript来实现这一点,因为我已经在客户端上拥有了所需的字节

这可能吗

编辑:
我应该澄清一下我到底在找什么。我正在使用Silverlight应用程序。在Silverlight中,我可以弹出一个保存对话框并保存字节(在本例中,假设它们是Excel字节)。这似乎就是人们在下面建议使用Flash时的建议。Silverlight提供了相同的功能

但是,我更希望Excel文件只在新的浏览器窗口中打开。如果在服务器上生成文件,我可以很容易地做到这一点,因为我可以只发送正确的头。但是我已经在客户端的Silverlight中有了字节。有没有办法在新的浏览器窗口中打开该文档,以便用户只需点击“打开”按钮,而无需选择保存位置并导航到该文件

我不能使用浏览器外应用程序选项。我知道,通过COM互操作与Excel对话可以使用它。但在这种情况下这是不可能的


但我可以从Silverlight与JavaScript进行互操作。所以我希望我能以某种方式使用JavaScript打开一个浏览器窗口,并将Excel字节流到其中。

用JavaScript?我希望不是这样,想想在纯javascript中可能导致的数百万安全隐患吧。这只在html5中可能实现,但目前还不可能

但是你可以做一些javascript/Flash10桥接,你把字节传递给打开“另存为”对话框的flash,然后你可以100%保存客户端

闪存可以动态加载


请参阅此处的一些代码:

有一个非跨浏览器解决方案(仅在Firefox中有效,并且仅在用户授予权限时有效)

但我建议您使用跨浏览器应用程序并选择Flash解决方案。

您可以使用它将文件嵌入HTML文档中;e、 创建一个链接,启动维基百科标题图像的下载。(MIME类型硬编码为
application/octet stream
,但您当然可以将其指定为PDF或XLS)


您需要将文件的字节编码为,并为资源创建一个数据URI。然后,创建一个新的锚元素,其
href
属性是数据URI。如果要自动启动下载,请下载到锚元素。

JavaScript无权访问客户端计算机上的文件系统。这是不可能的。您必须使用服务器语言(PHP、露比、C++等)来处理文件系统访问。我不想直接访问文件系统。我只想向浏览器发送一个字符串,上面写着“嘿,这是一个文件。为用户弹出一个保存对话框”。如果我从服务器发送一个具有正确头的字节流,浏览器也会做同样的事情。嗯,这很有趣。这是跨浏览器环境中的一种实用解决方案。很多用户都在使用IE6。我不确定它是否只支持这些数据URI.IE8+和其他浏览器。
// ask for security grants
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

var pngBinary = 'some string';

var aFile = Components.classes["@mozilla.org/file/local;1"].
            createInstance(Components.interfaces.nsILocalFile);
aFile.initWithPath( "/tmp/somefile.png" );
aFile.createUnique( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 600);
var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].
             createInstance(Components.interfaces.nsIFileOutputStream);
stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0);
stream.write(pngBinary, pngBinary.length);
if (stream instanceof Components.interfaces.nsISafeOutputStream) {
    stream.finish();
} else {
    stream.close();
}