创建一个临时文件并在用户计算机上的不同应用程序中打开它

问题描述

我正在编写一个内部公司网站,其中包括生成和呈现 XML 文件。这些文件通常不打算直接保存,用户应该很少需要首先查看原始文件。但是,该站点可以在用户计算机上安装的 XML 处理器中下载和打开文件

该网站最初是为 Internet Explorer 6 编写的,我正在尝试升级它以与现代浏览器兼容。它最初使用的与 IE6 兼容的代码是这样的:

function XmlOpen(path) { // path = "C:/Program Files/path/to/executable.exe",hardcoded
    // xmlOutput is a global variable containing the raw XML to be saved
    if (xmlOutput) {
        // global variable to cache most recently downloaded file. If the XML is regenerated
        // this will be reset
        if (!xmlTempPath) {
            var fso = new ActiveXObject("Scripting.FileSystemObject");
            var tempfolder = 2;
            var tfolder = fso.GetSpecialFolder(tempfolder);
            var tname = fso.GetTempName();
            var tempfile = tfolder.CreateTextFile(tname);
            tempfile.writeline(xmlOutput);
            tempfile.close();
            xmlTempPath = tfolder.Path + '\\' + tname;
        }
        var shell = new ActiveXObject("WScript.Shell");
        var cmd = '"' + path + '" "' + xmlTempPath + '"';
        shell.Run(cmd);
    }
    return false;
}

理想情况下,我对重写的要求是在初始点击之后需要尽可能少的用户交互。

我的基本方法是使用注册表项来标记适当的 XML 程序,而不是使用 ActiveXObjects。这些可以在入职过程中安装,也可以在安装我们所有其他内部工具时安装,所以我想我应该能够以 xmlprogram://filename 打开一个 url 并让它工作,只要我有一个文件可以使用它.

我还可以轻松下载文件,只需将 XML 写入 blob,生成随机文件名,并显示下载提示。但后来我不知道下载文件文件夹和实际名称,因此我无法使用 xmlprogram:// url 自动打开它。因此,我需要以某种方式将文件临时保存在我的 javascript 知道完整路径的地方,并使用链接调用用户的程序。但据我所知,目前无法在用户的计算机上写入实际的临时文件,也无法将 localstorage 视为文件

tl;dr 我如何将临时文件保存到用户的计算机上,以便我知道保存它的位置,并且可以让他们在不同的程序中自动打开它?

解决方法

根据你的问题,据我所知是不可能的。纯浏览器 JavaScript 无法获取有关用户文件系统的信息。默认下载路径也可能包含风险信息。

并且文件下载位置取决于浏览器中的设置,您不能绕过此设置,否则会侵犯用户的安全。