代码之家  ›  专栏  ›  技术社区  ›  Ankur

如何从uri确定文件的文件扩展名

  •  16
  • Ankur  · 技术社区  · 16 年前

    假设给了我一个URI,我想找到返回的文件的文件扩展名,那么在Java中我必须做什么呢。

    例如,文件位于 http://www.daml.org/2001/08/baseball/baseball-ont http://www.daml.org/2001/08/baseball/baseball-ont.owl

    当我这么做的时候

        URI uri = new URI(address); 
        URL url = uri.toURL();
        String file = url.getFile();
        System.out.println(file);
    

    .owl 分机,只是 /2001/08/baseball/baseball-ont 如何获得文件扩展名以及。

    7 回复  |  直到 16 年前
        1
  •  71
  •   Tim Visée ghostdog74    11 年前

    首先,我要确保您知道,由于链接以 .jpg .exe 文件(由于符号链接和.htaccess文件的缘故,这对于URL尤其如此),因此获取 真实的

    您可以使用下面的方法从任何URI、URL或文件路径获取扩展名。您不必使用任何库或扩展,因为这是基本的Java功能。这个解是最后一个的位置 . (period)在URI字符串中签名,并创建一个子字符串,从period符号的位置开始,到URI字符串的末尾结束。

    String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png";
    String extension = uri.substring(uri.lastIndexOf("."));
    

    此代码示例将在上面输出 .png extension 变量,请注意 . (period)包含在扩展名中,如果要收集不带前缀period的文件扩展名,请将子字符串索引增加1,如下所示:

    String extension = uri.substring(url.lastIndexOf(".") + 1);
    

    此外,您可能希望确保URL包含句点字符,请使用以下代码来实现这一点:

    String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png";
    if(uri.contains(".")) {
        String extension = uri.substring(url.lastIndexOf("."));
    }
    

    • 通过检查URI是否存在,或者通过确保URI的语法有效(可能使用正则表达式)来验证URI。
    • 修剪延伸部分以删除不需要的空白。

    希望这有帮助!

        2
  •  18
  •   Stephen C    14 年前

    有两个答案。

    如果一个URI没有“文件扩展名”,那么您就无法通过文本查看或将其转换为 File . 通常,URI或文件都不需要有扩展名。扩展名只是一个文件名 惯例 .

    您真正想要的是文件的媒体类型/MIMEtype/内容类型。您可以通过执行以下操作来确定介质类型:

    URLConnection conn = url.connect();
    String type = conn.getContentType();
    

    然而 getContentType() 方法将返回 null 如果服务器没有在响应中设置内容类型(或者它可能会给你一个错误的内容类型,或者一个非特定的内容类型。)在这一点上,你需要求助于内容类型“猜测”,我不知道在这种情况下,这是否会给你一个足够具体的类型。

    应该

        3
  •  15
  •   Community Mohan Dere    9 年前

    此链接可能对仍有问题的用户有所帮助: How I can get the mime type of a file having its Uri?

     public static String getMimeType(Context context, Uri uri) {
        String extension;
    
        //Check uri format to avoid null
        if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
            //If scheme is a content
            final MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
        } else {
            //If scheme is a File
            //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
            extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());
    
        }
    
        return extension;
    }
    
        4
  •  5
  •   reevesy onejigtwojig    13 年前

    URLConnection.guessContentTypeFromName(url) 将传递第一个答案中的mime类型。 也许你只是想:

    String extension = url.getPath().replaceFirst("^.*/[^/]*(\\.[^\\./]*|)$", "$1");
    

    一个正则表达式,使用所有字符直到最后一个斜杠,然后直到一个句点,并返回一个扩展名,如“.owl”或“”(如果没有弄错)

        5
  •  2
  •   sdgfsdh    9 年前

    Java 几乎 将此功能作为 URL URL::getFile 将智能地获取 :

    final URL url = new URL("http://www.example.com/a/b/c/stuff.zip?u=1");
    final String file = url.getFile(); // file = "/a/b/c/stuff.zip?u=1"
    

    我们可以用它来编写我们的实现:

    public static Optional<String> getFileExtension(final URL url) {
    
        Objects.requireNonNull(url, "url is null");
    
        final String file = url.getFile();
    
        if (file.contains(".")) {
    
            final String sub = file.substring(file.lastIndexOf('.') + 1);
    
            if (sub.length() == 0) {
                return Optional.empty();
            }
    
            if (sub.contains("?")) {
                return Optional.of(sub.substring(0, sub.indexOf('?')));
            }
    
            return Optional.of(sub);
        }
    
        return Optional.empty();
    }
    

    此实现应正确处理边缘情况:

    assertEquals(
        Optional.of("zip"), 
        getFileExtension(new URL("http://www.example.com/stuff.zip")));
    
    assertEquals(
        Optional.of("zip"), 
        getFileExtension(new URL("http://www.example.com/stuff.zip")));
    
    assertEquals(
        Optional.of("zip"), 
        getFileExtension(new URL("http://www.example.com/a/b/c/stuff.zip")));
    
    assertEquals(
        Optional.empty(), 
        getFileExtension(new URL("http://www.example.com")));
    
    assertEquals(
        Optional.empty(), 
        getFileExtension(new URL("http://www.example.com/")));
    
    assertEquals(
        Optional.empty(), 
        getFileExtension(new URL("http://www.example.com/.")));
    
        6
  •  2
  •   Nevil Ghelani    7 年前

    接受答案对于扩展名后包含“?”或“/”的url无效。所以,要去掉多余的绳子, 可以使用getLastPathSegment()方法。它只提供uri中的名称,然后可以获得如下扩展名:

    String name = uri.getLastPathSegment();
    //Here uri is your uri from which you want to get extension
    String extension = name.substring(name.lastIndexOf("."));
    

    以上代码的扩展名为.(dot)如果要删除该点,可以按以下方式进行编码:

    String extension = name.substring(name.lastIndexOf(".") + 1);
    
        7
  •  2
  •   Asad Ali Choudhry    7 年前

    另一个有用的方法是,如果您有一个远程url,那么您可以从URLConnection获取mimeType,如

      URLConnection urlConnection = new URL("http://www.google.com").openConnection();
      String mimeType = urlConnection.getContentType(); 
    

    现在要从MimeType获取文件扩展名,我将参考以下内容 post

        8
  •  -1
  •   Vikasdeep Singh    8 年前

    我是这样做的。

    您可以通过更多验证来检查任何文件扩展名:

    String stringUri = uri.toString();
    String fileFormat = "png";
    
                        if (stringUri.contains(".") && fileFormat.equalsIgnoreCase(stringUri.substring(stringUri.lastIndexOf(".") + 1))) {
    
                            // do anything
    
                        } else {
    
                            // invalid file
    
                        }
    
    推荐文章