如何使用file:方案在HTML中指定本地文件?

65

我正在加载一个托管在OS X内置Apache服务器上的html文件,在该文件中,我如下链接到同一目录中的另一个html文件:

<a href="2ndFile.html"><button type="submit">Local file</button>

这个代码可以运行。然而,由于一些太长的原因(不方便阐述),我正在尝试使用文件方案来替代它,但是我却无法让任何东西工作。以下是我使用文件方案重写上面那一行的方式:

<a href="file://192.168.1.57/~User/2ndFile.html"><button type="submit">Local file</button>

(192.168.1.57是我的当前IP地址)

将其更改为以下内容也无法正常工作:

<a href="file://Name-Of-MacBookPro/~User/2ndFile.html"><button type="submit">Local file</button>

但是找不到文件,使用file:方案应该如何指定?


除非我漏掉了什么,否则 file:// 是指客户端机器上的文件...因此,如果您正在尝试获取位于服务器上的文件,则应继续使用 HTTP... - Salketer
你的例子中没有以</a>结尾。因此,文档中剩下的所有HTML都包含在链接中。而且,可能还有其他我无法想象的复杂情况。 - undefined
5个回答

87
file: URL方案指的是客户端机器上的文件。在file:方案中没有主机名,只需要提供文件路径即可。因此,本地计算机上的文件路径应该是file:///~User/2ndFile.html。请注意三个斜杠;URL的主机名部分为空,因此路径开头的斜杠紧跟着URL开头的双斜杠。您还需要扩展用户的路径;在file: URL中,~不会被扩展。因此,在大多数Unix系统上,您需要使用file:///home/User/2ndFile.html,在Mac OS X上,您需要使用file:///Users/User/2ndFile.html,在Windows上,您需要使用file:///C:/Users/User/2ndFile.html
出于安全原因,许多浏览器不允许从从服务器加载的文件链接到本地文件。因此,您可能无法从通过HTTP加载的页面执行此操作;您只能从其他本地页面链接到file: URL。

1
如何在Windows上使用相对路径而不是C://? - Lei Yang
要使用相对路径,您只需包含相对路径,而不需要任何“file:”方案或“//”。因此,如果您有一个名为index.html的文件,并且想引用同一目录中的other_file.html,则只需直接链接到没有方案的other_file.html即可。 - Brian Campbell
@Brian那么没有任何方法可以下载本地文件,例如file:///home/User/2ndFile.html吗?我想知道是否有其他可用的替代方案? - Rrptm

4
"file://" URL协议仅可用于定位本地机器文件系统中的文件。由于此HTML代码是由浏览器解释的,因此“本地机器”是运行浏览器的计算机。
如果出现“文件未找到”错误,则可能是因为无法找到该文件。但是,这也可能是浏览器的安全限制。某些浏览器不允许您从非文件系统HTML页面引用文件系统文件。您可以尝试使用运行浏览器的计算机上的命令行文件路径来确认这是浏览器限制而不是缺少文件的合法性问题。"

是的,绝对不可能允许远程网页使用file协议。 如果允许的话,任何黑客都可以通过让你浏览到他们使用这些URL的页面来窥探你的文件系统。比如,file:///Users/turner/可能是你的主目录,而file:///etc/passwd则是你机器上所有用户的列表,file:///etc/ssh可能包含有关如何使用ssh登录到你的机器的信息(这取决于你的操作系统,但很容易猜到)。如果曾经允许过这样的操作,那么到了2000年,所有的浏览器都应该已经禁止了。不,不,不可能。 - undefined

4

'file'协议不是网络协议。因此,file://192.168.1.57/~User/2ndFile.html并没有什么意义。

问题在于如何加载第一个文件。这真的使用Web服务器完成吗?听起来似乎不是。如果是,为什么不使用相同的协议,很可能是http?你不能指望只是切换协议并以相同方式使用两个不同的协议...

我怀疑第一个文件根本没有使用Apache http服务器加载,而只是通过打开文件来实现?href="2ndFile.html"之所以有效,是因为它使用了“相对URL”。这使得浏览器使用与获取第一个(当前)文件的协议和路径相同的协议和路径。


第一个文件由客户端应用程序加载,我使用file://的原因是我正在尝试一些安全性方面的实验,并查看第一个文件是否可以使用file://。 - Gruntcakes
1
这些都很好(你所说的那点)。但是如果你使用文件协议,这与Apache没有任何关系。Apache是一个HTTP服务器。 - arkascha
我意识到当这个答案被写出来的时候可能不是这种情况:file schemeRFC1738 中提到的一种方案,并在 RFC8089 中进行了定义。URL Living Standard 使用 file scheme 进行示例。 - Orestis Kapar
@OrestisKapar 这确实是事实,但现在已经不相关了。 - Jim Balter

1

我之前也遇到过类似的问题,在我的情况下,文件在另一台机器上, 所以我将网络驱动器Z映射到文件所在的文件夹位置, 然后我在Tomcat中创建了一个上下文

因此,在我的Web项目中,我可以通过上下文访问HTML文件


你有检查过你提出的解决方案是否可行吗?如果没有,我建议你不要发布答案,因为这可能会误导其他人。 - Rann Lifshitz
是的,很久以前对我有用...正在编辑我的评论以获取更多细节。 - Mahmoud Elsonbati
这应该可以工作:file://///网络上的计算机名称/驱动器号/index.html - MeSo2

0

对于Apache,可以查找SymLink或通过符号链接在操作系统上解决,或在Linux上设置库链接/ etc

我的答案是针对Windows 10的一种方法。

因此,我的方法涉及将网络驱动器映射到U:/(例如,我使用G:/用于Google Drive)

打开cmd并键入hostname(示例结果:LAPTOP-G666P000,您也可以使用IP,但如果您的网络停止,则使用静态主机名更有意义)

Windows_key + E> 右键单击'This PC'>按N (这是映射网络驱动器,而不是添加网络位置)

如果您右键单击桌面上的快捷方式,则需要按N然后输入

填写U:G:Z:或任何您想要的内容 示例地址:\\LAPTOP-G666P000\c$\Users\username\

然后你可以像在你的问题中一样使用<a href="file:///u:/2ndFile.html"><button type="submit">Local file</button>


相关:您还可以使用此方法进行FTP,并在同一网络上设置多个驱动器以用于不同的相对路径。

相关2:我以前在某些WAMP / apache服务器上也使用过http://localhost/c$等,您可以使用.htaccess进行控制/安全性,但我建议不要在实时/生产机器上这样做-或者任何其他符号链接documentroot示例,您可以通过Google找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接