HTML中CSS文件的绝对网络路径?

时间:2015-07-28 12:24:39

标签: java html css

我维护一个用Java编写的小型ERP系统;此应用程序创建XHTML报告,这些报告使用存储在文件服务器上的中央目录中的CSS工作表进行样式设置。这是在异构环境中:Linux,Windows和各种浏览器。生成到CSS文件的适当链接变得困难。 CSS文件应该像这样引用:

<link rel="stylesheet" type="text/css" href="file:/server/path/to/file.css" />

这是使用Java中的File.toURI()生成的,但是它在Windows下不起作用。 的工作结果因浏览器和操作系统的不同而变化:

  • 在Linux下&#34;文件:&#34;协议是可选的。您可以使用1个,3个,4个或5个斜杠(但不是2个)开始路径。这与Chromium和Firefox相同。
  • 在Windows下,如果省略&#34;文件:&#34;,那么IE会坚持使用2个斜杠来启动路径,但Firefox坚持只有5个斜杠。如果你包含&#34;文件:&#34;协议,然后IE将接受2,4或5斜杠; Firefox仍然需要5个斜杠。

因此,似乎适用于所有系统和浏览器的唯一变体是

<link rel="stylesheet" type="text/css" href="file://///server/path/to/file.css" />

对此的解释,尽可能接近:URI中的三个斜杠表示本地文件系统上的上下文。 Windows网络路径以两个反斜杠开头,但URI中不允许使用反斜杠,因此它们显然会成为另外两个正斜杠。

URI syntax specification中没有出现这样的内容。也没有简单的方法来生成这样的奇怪的URI - 你必须自己添加额外的斜杠。

我觉得有必要以独立于平台的方式处理本地资源的链接。我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果其他人最终发布更好的答案,我会接受。与此同时,这是我提出的解决方法(用Java)。关键是要生成一个始终以“file://///”开头的URI。

/**
     * This method produces a URI than can be embedded in HTML to reference a file in the local
     * network, for example, a CSS file. The only format that seems to work across browsers and
     * operating systems is one containing five slashes, i.e., file://///server/path/to/file.css.
     * Firefox is the most difficult browser to please, particularly under Windows.
     * 
     * Note that the toString() and getPath() methods of the URI object product different results
     * depending on the operating system; hence, we must remove all slashes from the start of the
     * path, before adding what we want.
     * 
     * @param fileIn
     *            A file object referencing the file
     * @return A string that can be embedded as a URI in an HTML file
     */
    private String fixHtmlUri(File fileIn) {
        URI uri = fileIn.toURI();
        String path = uri.getPath();

        // Remove all slashes from the beginning of the path
        int numSlashesAtStart = 0;
        while (path.charAt(numSlashesAtStart) == '/') numSlashesAtStart++;
        String strippedUriString = path.substring(numSlashesAtStart);

        // Add the require five slashes plus the file protocol
        return "file://///" + strippedUriString;
    }