Получение расширения файла из http URL с использованием Java
Теперь я знаю о FilenameUtils.getExtension()
из апача.
Но в моем случае я обрабатываю расширения из URL-адресов http(s), поэтому в случае, если у меня есть что-то вроде
https://your_url/logo.svg?position=5
этот метод вернется svg?position=5
Есть ли лучший способ справиться с этой ситуацией? Я имею в виду без написания этой логики сам.
2 ответа
Вы можете использовать библиотеку URL от JAVA. Это имеет много полезности в этом случае. Вы должны сделать что-то вроде этого:
String url = "https://your_url/logo.svg?position=5";
URL fileIneed = new URL(url);
Затем у вас есть много методов получения для переменной fileIneed. В вашем случае getPath() получит это:
fileIneed.getPath() ---> "/logo.svg"
А затем используйте библиотеку Apache, которую вы используете, и у вас будет строка svg.
FilenameUtils.getExtension(fileIneed.getPath()) ---> "svg"
Документация по библиотеке URL JAVA >>> https://docs.oracle.com/javase/7/docs/api/java/net/URL.html
Если вам нужно решение brandname®, рассмотрите возможность использования метода Apache после удаления строки запроса, если она существует:
String url = "https://your_url/logo.svg?position=5";
url = url.replaceAll("\\?.*$", "");
String ext = FilenameUtils.getExtension(url);
System.out.println(ext);
Если вы хотите использовать однострочник, который даже не требует внешней библиотеки, рассмотрите эту опцию, используя String#replaceAll
:
String url = "https://your_url/logo.svg?position=5";
String ext = url.replaceAll(".*/[^.]+\\.([^?]+)\\??.*", "$1");
System.out.println(ext);
svg
Вот объяснение шаблона регулярного выражения, использованного выше:
.*/ match everything up to, and including, the LAST path separator
[^.]+ then match any number of non dots, i.e. match the filename
\. match a dot
([^?]+) match AND capture any non ? character, which is the extension
\??.* match an optional ? followed by the rest of the query string, if present