我在使用自定义协议通过浏览器打开本地文件时遇到了一些实际问题。现在,在您开始使用自定义协议之前,此Web应用程序将在封闭的Intranet环境中运行,因此我可以完全控制为所有用户添加这些协议。该应用程序目前工作正常,但我被要求绕过文件的打开/保存对话框,因为它“烦人”和“耗时”(是的,我知道......我试图告诉他们),所以这里我在未知领域!
以下是一个不起作用的示例(我在此示例中使用记事本在带有IIS7的Server 2008 R2中进行测试):
使用Registering an Application to a URL Protocol上的信息我已将以下内容添加到注册表中:
HKEY_CLASSES_ROOT
opentxt
(Default) = "URL:opentxt Protocol"
URL Protocol = ""
DefaultIcon
(Default) = "C:\Windows\System32\notepad.exe,1"
shell
open
command
(Default) = "C:\Windows\System32\notepad.exe" "%1"
所以现在,从理论上讲,它应该像在我的html中使用以下链接一样简单
<a href="opentxt://localhost/openme.txt">Open File</a>
它几乎可以工作 - 点击链接,它立即打开记事本,但是我在记事本中出现了这个错误。
The filename, directory name, or volume label syntax is incorrect
该文件肯定存在于该位置(我可以使用http: //localhost/openme.txt
来阅读),并且我尝试用尽可能多的不同格式表示链接,例如描述here但只是可以'让它发挥作用。
我出错的任何想法?
答案 0 :(得分:3)
很简单,你混淆了两种不同的协议。
您的协议 - 以及您传递给记事本的网址 - 是opentxt://localhost/openme.txt
。该文件的工作位置为http: //localhost/openme.txt
。这两个不一样!
HTTP是操作系统本身可以理解的协议,因此,记事本可以将HTTP Url传递给操作系统,操作系统又使用端口80连接到localhost
并发送请求那资源。返回文件,记事本有其数据。这都是在定义HTTP行为的操作系统库中处理的。
除非您对其进行编码,否则您的opentxt
协议没有此支持。记事本不知道该怎么做 - 所以你看到你的错误信息。
轻松处理此问题的方法是创建自己的应用程序来处理协议。如果您通过注册表连接opentxtHandler.exe
,则会传递opentxt://
网址,然后可以适当地处理它。这可能只是意味着将协议从opentxt
更改为http
,然后将其传递给记事本 - 或者它可能更复杂。