Подтвердить что ты не робот

Как определить расширение файла файла из 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);

Я не могу видеть полное имя файла с расширением .owl, просто /2001/08/baseball/baseball-ont, как получить расширение файла. ``

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

                        // do anything

                    } else {

                        // invalid file

                    }

Ответ 8

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

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

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