Как определить расширение файла файла из uri

предполагая, что мне дали 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);

Я не могу увидеть полное имя файла с

6 ответов


во-первых, я хочу убедиться, что вы знаете, что невозможно узнать, какой файл URI ссылки тоже, так как ссылка заканчивается на .jpg может позволить вам получить доступ к .exe file (это особенно верно для URL, из-за символических ссылок и .htaccess files), таким образом, это не твердое решение для извлечения реальные расширение из URI, если вы хотите ограничить разрешенные типы файлов, если это то, что вы собираетесь, конечно. Итак, я предполагаю, что вы просто хотите знать, что расширение файл основан на его URI, хотя это не является полностью надежным;

вы можете получить расширение из любого URI, URL или пути к файлу, используя метод ниже. Вам не нужно использовать библиотеки или расширения, так как это базовая функциональность Java. Это решение get-это позиция последнего . (период) войдите в строку 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("."));

этот код образец будет выше выведет .png расширение от URI в extension переменная, обратите внимание, что a . (period) включен в расширение, если вы хотите собрать расширение файла без префиксного периода, увеличьте индекс подстроки на один, например:

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

один pro для использования этого метода над регулярными выражениями (метод, который другие люди используют много) заключается в том, что это намного дешевле ресурсов и намного менее тяжело выполнить, давая то же самое результат.

кроме того, вы можете убедиться, что 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 не имеет "расширения файла", то вы не можете сделать вывод, глядя на него текстуально или конвертируя его в File. В общем, ни URI, ни файл не должны иметь расширения вообще. Расширения-это просто имя файла .

то, что вам действительно нужно, - это тип носителя / тип MIMEtype / тип содержимого файла. Вы можете определить тип носителя по делать что-то вроде этого:

URLConnection conn = url.connect();
String type = conn.getContentType();
на getContentType() метод возвращает null если сервер не установил тип контента в ответе. (Или это может дать вам неправильный тип контента или неспецифический тип контента.) В этот момент вам нужно будет прибегнуть к типу контента "угадывание", и я не знаю, даст ли это вам достаточно конкретный тип в этом случае.

а если вы "знаете", что файл должны быть совой, почему бы и нет просто дай ему ".сова " расширение в любом случае?


эта ссылка может помочь тем, у кого все еще есть проблемы: Как я могу получить тип mime файла с его 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;
}

URLConnection.guessContentTypeFromName(url) доставит тип mime, как в первом ответе. Может быть, вы просто хотели:

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

регулярное выражение, потребляющее все до последней косой черты, затем до периода и либо возвращает расширение, подобное ".сова или."" (Если не ошибаюсь)


как объясняли другие ответы, вы действительно не знаете тип контента без проверки файла. Однако можно предсказать тип файла по URL-адресу.

Java почти предоставляет эту функциональность как часть URL класса. Метод URL::getFile разумно захватить часть файла URL:

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/.")));

Я делаю это таким образом.

вы можете проверить любое расширение файла с дополнительной проверкой:

String stringUri = uri.toString();
String fileFormat = "png";

                    if (stringUri.contains(".") && fileFormat.equalsIgnoreCase(stringUri.substring(stringUri.lastIndexOf(".") + 1))) {

                        // do anything

                    } else {

                        // invalid file

                    }