我维护一个用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下不起作用。 的工作结果因浏览器和操作系统的不同而变化:
因此,似乎适用于所有系统和浏览器的唯一变体是
<link rel="stylesheet" type="text/css" href="file://///server/path/to/file.css" />
对此的解释,尽可能接近:URI中的三个斜杠表示本地文件系统上的上下文。 Windows网络路径以两个反斜杠开头,但URI中不允许使用反斜杠,因此它们显然会成为另外两个正斜杠。
URI syntax specification中没有出现这样的内容。也没有简单的方法来生成这样的奇怪的URI - 你必须自己添加额外的斜杠。
我觉得有必要以独立于平台的方式处理本地资源的链接。我错过了什么?
答案 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;
}