Как определить расширение файла из URI - PullRequest
17 голосов
/ 13 июля 2010

Если мне дан URI, и я хочу найти расширение возвращаемого файла, что мне делать в Java.

Например, файл http://www.daml.org/2001/08/baseball/baseball-ont is 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 как мне получить расширение файлатакже.``

Ответы [ 8 ]

55 голосов
/ 30 января 2013

Сначала я хочу убедиться, что вы не можете определить, к какому файлу относится ссылка URI, поскольку ссылка, заканчивающаяся .jpg, может позволить вам получить доступ к файлу .exe (это особенно верно для URL, из-за символических ссылок и файлов .htaccess), поэтому не является надежным решением для извлечения расширения real из 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("."));

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

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 действителен, возможно, с использованием регулярного выражения.
  • Обрежьте расширение, чтобы удалить ненужные пробелы.

Я не буду рассказывать о решениях для этих двух функций здесь, потому что это не то, о чем в первую очередь спрашивали.

Надеюсь, это поможет!

14 голосов
/ 13 июля 2010

На этот вопрос есть два ответа.

Если URI не имеет «расширения файла», то вы не сможете вывести его, посмотрев на него текстуально или преобразовав его вFile.Как правило, ни URI, ни File не должны иметь расширения вообще.Расширения - это просто именование файлов соглашение .

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

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

Однако метод getContentType() вернет null, если сервер не установил тип содержимогов ответ.(Или это может дать вам неправильный тип контента или неконкретный тип контента.) В этот момент вам нужно будет прибегнуть к типу контента «угадывание», и я не знаю, даст ли это вам достаточно конкретную информацию.введите в этом случае.

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

9 голосов
/ 09 апреля 2016

Эта ссылка может помочь тем, у кого все еще есть проблемы: Как я могу получить 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;
}
5 голосов
/ 11 мая 2011

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

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

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

1 голос
/ 15 апреля 2019

Еще один полезный способ, который не упомянут в принятом ответе: если у вас есть удаленный URL-адрес, вы можете получить mimeType из URLConnection, например

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

Теперь, чтобы получить расширение файла из MimeType, я 'буду ссылаться на этот пост

1 голос
/ 27 января 2019

Принятый ответ бесполезен, так как 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("."));

код выше получает расширение с помощью. (Точка), если вы хотите удалить точку, то вы можете кодировать следующим образом:

String extension = name.substring(name.lastIndexOf(".") + 1);
1 голос
/ 06 июня 2017

Как объяснили другие ответы, вы на самом деле не знаете тип контента, не проверив файл.Однако вы можете предсказать тип файла по 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/.")));
0 голосов
/ 25 октября 2016

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

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

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

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

                        // do anything

                    } else {

                        // invalid file

                    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...