代码之家  ›  专栏  ›  技术社区  ›  Green Cloak Guy

创建临时文件并在用户计算机上的其他应用程序中打开

  •  0
  • Green Cloak Guy  · 技术社区  · 3 年前

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

    该网站最初是为InternetExplorer6编写的,我正在尝试将其升级为与现代浏览器兼容。它最初使用的与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。这些可以在入职期间安装,也可以在安装我们所有其他内部工具时安装,所以我想我应该能够打开一个url作为 xmlprogram://filename 让它工作,只要我有一个文件。

    我也可以很容易地下载一个文件,只需将XML写入一个blob,生成一个随机文件名,并显示下载提示。但我不知道下载文件的文件夹和实际名称,所以我不能用 xmlprogram:// url。因此,我需要以某种方式将文件临时保存在我的javascript知道完整路径的地方,并使用链接在上面调用用户的程序。但据我所知,目前不可能在用户的计算机上写入实际的临时文件,也不能将本地存储视为文件。

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

    0 回复  |  直到 3 年前
        1
  •  0
  •   Xudong Peng    3 年前

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

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