假设我有一个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
我如何获得文件扩展名。
``
答案 0 :(得分:54)
首先,我想确保您知道找不到URI链接的文件类型是不可能的,因为以.jpg
结尾的链接可能允许您访问.exe
文件(这由于符号链接和.htaccess文件,URL尤其如此),因此如果要限制允许的文件类型,如果要限制允许的文件类型,则不能从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
扩展名,请注意,如果您愿意,扩展名中包含.
(句点)收集没有前缀句点的文件扩展名,将子字符串索引增加1,如下所示:
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("."));
}
您可能希望进一步改进功能,以创建更强大的系统。两个例子可能是:
我不会在这里介绍这两个功能的解决方案,因为这不是首先要问的。
希望这有帮助!
答案 1 :(得分:14)
这有两个答案。
如果URI没有“文件扩展名”,那么您无法通过文本查看或将其转换为File
来推断它。通常,URI或文件都不需要具有扩展名。扩展程序只是一个命名约定的文件。
您真正关注的是文件的媒体类型/ MIMEtype /内容类型。您可以通过执行以下操作来确定媒体类型:
URLConnection conn = url.connect();
String type = conn.getContentType();
但是,如果服务器未在响应中设置内容类型,则getContentType()
方法将返回null
。 (或者它可能会给你错误的内容类型或非特定的内容类型。)此时,你需要诉诸内容类型“猜测”,我不知道这是否会给你一个特定的内容在这种情况下键入。
但是如果你“知道”文件应该是OWL,你为什么不直接给它一个“.owl”扩展呢?
答案 2 :(得分:9)
此链接可能对仍有问题的人有所帮助: 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;
}
答案 3 :(得分:5)
URLConnection.guessContentTypeFromName(url)
会像第一个答案中那样传递mime类型。
也许你只是想要:
String extension = url.getPath().replaceFirst("^.*/[^/]*(\\.[^\\./]*|)$", "$1");
正则表达式消耗所有直到最后一个斜杠,然后到一个句点并返回一个类似“.owl”或“”的扩展名。 (如果没有记错的话)
答案 4 :(得分: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 = "/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/.")));
答案 5 :(得分:1)
接受的答案不适用于网址包含“?”或扩展名后的'/'。因此,要删除多余的字符串, 您可以使用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);
答案 6 :(得分:0)
我是这样做的。
您可以使用更多验证检查任何文件扩展名:
String stringUri = uri.toString();
String fileFormat = "png";
if (stringUri.contains(".") && fileFormat.equalsIgnoreCase(stringUri.substring(stringUri.lastIndexOf(".") + 1))) {
// do anything
} else {
// invalid file
}
答案 7 :(得分:0)
在公认的答案中没有提到的另一种有用的方法是,如果您有一个远程URL,则可以从URLConnection获得mimeType,就像
URLConnection urlConnection = new URL("http://www.google.com").openConnection();
String mimeType = urlConnection.getContentType();
现在要从MimeType获取文件扩展名,我将参考此post