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

2022-09-01 07:05:24

假设我得到了一个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


答案 1

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

您可以使用下面的方法从任何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("."));

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

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

此链接可能对那些仍然有问题的人有所帮助:如何获取具有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;
}