从JavaScript字符串保存文件而不命中服务器

时间:2011-02-22 18:42:29

标签: javascript silverlight

如果我有一个在内存中的字符串中的JavaScript是假设Excel或PDF格式,我想弹出打开一个保存对话框,使用户可以保存这些字节到一个文件,我怎么会去这样做?我试图避免回到服务器。如果我要回到服务器,我可以在响应中发送正确的HTTP标头,告诉浏览器我正在发送文件。但是我希望从JavaScript中做到这一点,因为我已经在客户端上拥有了我需要的字节。

这可能吗?

编辑:
我应该澄清一下我在这里寻找的东西。我正在使用Silverlight应用程序。从Silverlight,我可以弹出一个保存对话框并保存字节(在这种情况下,假设它们是Excel字节)。这似乎是人们在建议使用Flash时的建议。 Silverlight提供相同的功能。

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

我无法使用浏览器外的应用程序选项。我知道可以通过COM-interop与Excel交谈来使用它。但在这种情况下,这是不行的。

但我可以使用Silverlight的JavaScript进行互操作。所以我希望我能以某种方式使用JavaScript来打开浏览器窗口并将Excel字节流传输给它。

4 个答案:

答案 0 :(得分:4)

您可以使用data URIs将文件嵌入HTML文档中;例如,http://jsfiddle.net/dqWae/创建启动维基百科标题图像下载的链接。 (MIME类型硬编码为application/octet-stream,但您当然可以将其指定为PDF或XLS。)

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

答案 1 :(得分:1)

在JavaScript中?我希望不会,想到可能造成的数百万安全隐患......

答案 2 :(得分:1)

在纯JavaScript中,这只能用html5进行,但目前暂不行。

但你可以做一些javascript / flash 10桥接,你将字节传递给Flash,打开“另存为”对话框,然后就可以节省100%的客户端。

可以动态加载闪光灯。

在此处查看一些代码:http://sujitreddyg.wordpress.com/2008/11/04/filereference-in-flash-player-10/

答案 3 :(得分:0)

有一种非跨浏览器解决方案(仅适用于Firefox,仅适用于用户授予权限)。

// 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();
}

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