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