2010-07-13 3 views
11

Предполагая, что мне предоставлен URI, и я хочу найти расширение файла возвращаемого файла, что мне нужно сделать в Java.Как определить расширение файла файла из uri

Например, файл на 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 как получить расширение файла, как Что ж. ``

ответ

37

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

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

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

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

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

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

+9

Это не сработает, если URL-адрес имеет знак вопроса после имени файла или хэша. –

+0

Этот символ периода, который вы добавили, не делает ничего очень полезного, так как в любом случае до домена верхнего уровня существует период. –

12

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

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

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

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

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

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

5

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

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

Регулярное выражение потребляя все ДО последнего слеша, то ДО периода и возвращает либо расширение, как «.owl» или „“. (Если не ошибаюсь)

+1

Что значит «$ 1» означает? Пожалуйста, объясните ... – artapart

+1

@JavaRocks - прочитайте javadocs :-) –

+0

URLConnection.guessContentTypeFromName (адрес) // (String address) - лучший ответ imho. –

5

Эта ссылка может помочь тем, кто по-прежнему возникают проблемы: How I can get the mime type of a file having its 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; 
} 
+0

не работает для меня –

0

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

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

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

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

         // do anything 

        } else { 

         // invalid file 

        } 
1

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