从浏览器启动桌面应用程序






3.79/5 (8投票s)
如何从浏览器打开桌面应用程序
引言
我被要求找到一种方法,使用户能够从他们的浏览器启动(特定的)本地应用程序。由于服务器无法直接指定在客户端打开文件,因此必须由客户端操作系统隐式处理,但又必须从浏览器触发 - 这对于与客户端系统进行交互来说,为了安全起见,会受到很大限制。
背景
我工作的公司几乎所有的应用程序都迁移到了基于Web的应用程序。但是,仍然有一些需要桌面链接才能启动的遗留应用程序(通常是 C++、C#)。想法是将链接放在浏览器中来启动它们。然而,这需要小心处理浏览器内置的各种安全协议。不过,有迹象表明,在适当的情况下,这是可行的——因为我可以在 Web 服务器上生成 XML 格式的 Excel 电子表格,然后系统会在客户端使用 Excel 打开它们。
Using the Code
要从浏览器链接启动本地可执行文件,必须让系统认为本地文件是适合和有效的打开目标。例如,.pdf 文件由 Adobe Reader 打开。系统被请求打开文件,作为链接(或 JavaScript 中的 location.assign()
),通常会询问您是保存还是打开文件。
因此,我们得到了第一个线索:客户端操作系统(以及通过代理的浏览器)需要被告知尝试打开某个文件,以需要特定的本地资源。我们需要从系统触发一个适当的“open-with
”(打开方式)查询,并将其分配给我们的目标本地应用程序。不幸的是,除了典型的内置功能之外,事情并没有那么简单。
第二部分是工作的重点——因为浏览器不幸的是不是那么配合,并不会仅仅因为你将一个可执行文件分配给一个特定的文件扩展名就启动它。浏览器只会尝试在浏览器窗口中打开该文件并显示它。
回顾一下,有两个步骤:
- 设置您的客户端系统,将特定的文件扩展名与客户端上的特定应用程序关联起来。在本例中,文件的名称是 TEXT.BOGUS。
- 让浏览器通过打开应用程序而不是渲染文件来响应文件(链接)。这需要解释链接——使用脚本语言扩展将说服服务器为您执行此操作,同时设置目标扩展名,然后打开所需的应用程序。
事实证明,第一步正如预期的那样,非常简单。您创建一个文件,然后将其作为附件通过电子邮件发送给自己。这是实际的技巧。通过电子邮件的“open with
”(打开方式)路由似乎能正常工作,而通过 Explorer 的“open with
”(打开方式)路由则不行。
第二步费了些功夫,虽然内容很简单,但找到并整理这些信息花了不少时间来确定需要做什么以及如何去做。结果发现,您链接到的文件会被浏览器打开,进行检查,然后被正确处理。因此,有必要说服浏览器,传入的项目是将被应用程序打开的数据文件,而不是将在浏览器中打开的文本文件。这可以通过控制“header
”信息来实现,使用以下文件内容(对于 PHP)
<?php
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; '.'filename="TEST.BOGUS"');
// It is essential that no output occurs before these appear in the file
// or you'll receive the notorious "headers already sent" error.
?>
第一个 header()
函数将浏览器设置为处理二进制数据流,就像您要喂给许多应用程序一样。
第二个 header()
函数指示浏览器将传入的数据作为附件(用于外部使用)而不是内嵌(用于浏览器使用,例如显示纯文本)进行处理。它还包含一个文件名,该文件的扩展名会告知客户端操作系统正在接收的文件类型,然后默认使用预先选定的应用程序作为打开它的选项。
上述代码预先选择了打开目标文件“TEST.BOGUS”,该文件将在您创建链接时生成的“打开/保存”弹出窗口中显示。上述代码是我目标文件的全部内容,我将其命名为 header_test.php。然后,我将此文件用作各种链接方法的对象。我并不直接链接到 TEST.BOGUS。
关注点
要在浏览器中打开的文件是一个脚本,它会生成触发操作的 header 信息。它在内部包含对文件类型的引用。这将触发“打开/保存”弹出窗口中的初始选项,从而为用户定位应用程序。
最好通过将具有自定义扩展名的文件作为附件通过电子邮件发送给自己,从电子邮件中打开它,然后将其分配给可执行文件作为默认处理程序来分配文件类型操作。
在执行 header()
指令之前,确保没有任何输出(如 ECHO)至关重要。
除了链接和 location.assign()
之外,另一种启动这些应用程序的方式是将其作为 HTML <form>
的“action
”目标。
如果您的应用程序需要初始化文件,请注意,在执行时,您的当前工作目录是您的 temp 目录——您可以将 .ini 文件放在那里,但这可能会有问题,因为操作系统可能会定期清除该文件夹。