如何确定url是否引用文件或目录?链接http://example.com/test.txt应该返回它是一个文件,http://example.com/dir/是一个目录
我知道你可以用Uri类做到这一点,但是这个对象的IsFile函数只适用于file:///方案。我正在使用http://格式。知道的吗?
谢谢
我不知道为什么这个问题这么长时间没有得到回答/被忽视。我在服务器端java中也遇到了同样的情况(估计Android的情况也差不多)。唯一的输入信息是资源的URL,我们需要判断该资源是目录还是文件。这就是我的解决方案。
if ("file".equals(resourceUrl.getProtocol())
&& new File(resourceUrl.toURI()).isDirectory()) {
// it's a directory
}
希望这对下一个读者有所帮助。
注:请参见@awwsmm评论。这是我在提供上述答案时的假设。基本上,测试远程资源是否是目录或其他东西是没有意义的。对于每个请求返回什么完全由站点决定
无法工作,因为协议将是http://而不是file://。
class TestURL{
public static boolean isDirectory(URL resourceUrl){
if ("file".equals(resourceUrl.getProtocol())
&& new File(resourceUrl.toURI()).isDirectory()) {
true;
}
return false;
}
public static void main(String[] args){
System.out.println(TestURL.isDirectory("http://example.com/mydir/"));
}
}
我认为目录http://example.com/some/dir
会重定向到http://example.com/some/dir/
,而文件不会。
即可以检查http Location
字段在HEAD响应:
$ curl -I http://example.com/some/dir | grep Location
Location: http://example.com/some/dir/
在我的案例中,我需要使用HTTPS下载文件,并且有时服务器被错误配置为重定向请求,因此只下载http数据。
就我而言,我能够"决定"所请求的资源是否为文件正在检查"内容类型"。/又名MIME类型。
String[] allowedMimeTypes = new String[] { "application/octet-stream", "image/gif",
"text/css", "text/csv", "text/plain", "text/xml" };
URL website = new URL("https://localhost/public/" + file);
HttpsURLConnection huc = (HttpsURLConnection) website
.openConnection();
if (!Arrays.asList(allowedMimeTypes).contains(huc.getContentType())) {
throw new Exception("Not a file...");
}
当响应包含text/html;charset=utf-8
或类似的内容时,我能够确定它确实不是一个文件。
还要注意,这些MIME类型通常在服务器端是完全可配置的。