如何确定一个URL是指向文件还是目录。链接http://example.com/test.txt应该返回它是一个文件,而http://example.com/dir/是一个目录。
我知道你可以使用Uri类来实现这个功能,但是这个对象的IsFile函数只适用于file:///协议。而我正在使用http://协议。有什么想法吗?
谢谢
如何确定一个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的评论。以上是我的假设。基本上,测试远程资源是否是目录或其他内容是没有意义的。每个请求返回什么完全取决于站点决定。
file://
,而他们正在尝试使用http://
。 - 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/
,而文件则不会。
即可以检查头响应中的httpLocation
字段:
$ curl -I http://example.com/some/dir | grep Location
Location: http://example.com/some/dir/
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 类型通常在服务器端是可配置的。