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

Ank*_*kur 18 java url uri file

假设我有一个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);
Run Code Online (Sandbox Code Playgroud)

我无法看到带.owl扩展名的完整文件名,/2001/08/baseball/baseball-ont我也是如何获得文件扩展名的.``

Tim*_*sée 58

首先,我想确保您知道找不到URI链接的文件类型是不可能的,因为以链接结尾.jpg可能允许您访问.exe文件(由于符号链接和.htaccess,这对URL来说尤其如此)因此,如果你想限制允许的文件类型,那么从URI中获取真正的扩展名并不是一个坚如磐石的解决方案,如果这是你当然想要的.所以,我假设你只是想知道一个文件基于它的URI的扩展名,即使这不是完全值得信赖的;

您可以使用下面的方法从任何URI,URL或文件路径获取扩展名.您不必使用任何库或扩展,因为这是基本的Java功能.此解决方案获取.URI字符串中最后一个(句点)符号的位置,并创建一个从句点符号位置开始的子字符串,结束于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("."));
Run Code Online (Sandbox Code Playgroud)

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

String extension = uri.substring(url.lastIndexOf(".") + 1);
Run Code Online (Sandbox Code Playgroud)

在正则表达式(一种其他人经常使用的方法)上使用此方法的一个专业人员是,这种资源的资源要少得多,并且在给出相同结果的同时执行起来要轻得多.

此外,您可能希望确保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("."));
}
Run Code Online (Sandbox Code Playgroud)

您可能希望进一步改进功能以创建更强大的系统.两个例子可能是:

  • 通过检查URI是否存在来验证URI,或者通过确保URI的语法有效,可能使用正则表达式来验证URI.
  • 修剪扩展名以删除不需要的空格.

我不会在这里介绍这两个功能的解决方案,因为这不是首先要求的.

希望这可以帮助!

  • 如果url在文件名或散列后面有问号,则无效. (13认同)
  • 您添加的句点字符检查没有做任何非常有用的事情,因为无论如何在顶级域之前都有一个句点。 (3认同)

Ste*_*n C 14

这有两个答案.

如果URI没有"文件扩展名",那么您无法通过文本查看或将其转换为a来推断它File.通常,URI或文件都不需要具有扩展名.扩展只是一个文件命名约定.

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

URLConnection conn = url.connect();
String type = conn.getContentType();
Run Code Online (Sandbox Code Playgroud)

但是,如果服务器未在响应中设置内容类型,则该getContentType()方法将返回null.(或者它可能会给你错误的内容类型或非特定的内容类型.)那时,你需要诉诸内容类型"猜测",我不知道这是否会给你一个足够的特定内容输入这种情况.

但是,如果你"知道"该文件应该是OWL,那么你为什么不给它一个".owl"扩展呢?


Aar*_*ron 9

此链接可能对那些仍然有问题的人有所帮助: 如何获取具有其Uri的文件的mime类型?

 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;
}
Run Code Online (Sandbox Code Playgroud)


Nev*_*ani 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("."));
Run Code Online (Sandbox Code Playgroud)

上面的代码使用 .(dot) 进行扩展,如果你想删除点,那么你可以编写如下代码:

String extension = name.substring(name.lastIndexOf(".") + 1);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

正则表达式消耗所有直到最后一个斜杠,然后到达一个句点并返回一个类似".owl"或""的扩展名.(如果没有记错的话)