检查URL是指向文件还是目录。(HTTP)

6

如何确定一个URL是指向文件还是目录。链接http://example.com/test.txt应该返回它是一个文件,而http://example.com/dir/是一个目录。

我知道你可以使用Uri类来实现这个功能,但是这个对象的IsFile函数只适用于file:///协议。而我正在使用http://协议。有什么想法吗?

谢谢


你是指服务器端吗?用什么语言/框架? - rene
1
JAVA Android。我想制作一个可以显示任何类型文档的应用程序。我知道可以通过shouldOverRideURLLoading()来实现,其中我检查.PDF或.DOC等文件扩展名。我想知道是否有其他方法可以实现这个目的。我的意思是除了扩展名之外,URL中是否还有其他信息? - roopak27
我不是Java/Android方面的专家。我已经为你的问题添加了正确的标签,这样其他人就可以看到并回答了... - rene
使用URL.getPath()可以检索URL中的路径。但是,我还需要为扩展名设置搜索条件。我认为没有其他方法可以确定URL是文件还是目录。 - roopak27
4个回答

4

我不确定为什么这个问题会被长时间地无人回答/忽视。在服务器端的Java中(我认为Android也会类似),我遇到了同样的情况。唯一的输入信息是资源的URL,我们需要确定该资源是目录还是文件。所以这是我的解决方案。

if ("file".equals(resourceUrl.getProtocol())
    && new File(resourceUrl.toURI()).isDirectory()) {
    // it's a directory
}

希望这能帮助到下一个读者。

注意:请查看@awwsmm的评论。以上是我的假设。基本上,测试远程资源是否是目录或其他内容是没有意义的。每个请求返回什么完全取决于站点决定。


可以的。或者你可以检查路径中的最后一个元素是否有扩展名? - Debosmit Ray
感谢您的评论,Debosmit。这可能是最有效的方法,但在我看来相当不可靠。在*nix系统中,并且可能在Windows中,普通文件可以存在而没有扩展名。 - t7tran
是的,这正是我在写评论时想到的。 :p - Debosmit Ray
1
OP明确表示这仅适用于file://,而他们正在尝试使用http:// - awwsmm

0

这样行不通,因为协议应该是 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/"));
   }
 }

0

我认为目录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/

我不会给这个点踩,但这只适用于某些Web服务器。 - TheKodeToad

0
在我的案例中,我需要使用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 类型通常在服务器端是可配置的。


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