Java获取URL对应的文件类型及其后缀的主流方法有三种:
1、根据文件头部数据来判断。
通常需要先下载再判断,但是如果想要在下载的时候确定文件后缀,就做不到了,而且获取的文件类型不是很准确。
2、使用lastIndexOf去解析url字符串。
这种方法最简单高效。
3、UrlConnection获取ContentType的类型推测出文件的类型。
这里我封装了一个工具类,将第二种方法和第三种方法结合,但是不是用lastIndexOf,而是判断url字符串是否包含图片的后缀。
package johny.utils;
import java.net.URLConnection;
/**
* @author Johny 林子豪 https://www.zhihu.com/people/linzihao-239
*/
public enum ImageTypeUtil {
PNG(".png", "image/png"),
JPG(".jpg", "image/jpeg"),
BMP(".bmp", "image/bmp"),
JPEG(".jpeg", "image/jpeg"),
GIF(".gif", "image/gif"),
TIF(".tif", "image/tiff"),//标签图像文件格式(Tagged Image File Format,简写为TIFF)是一种主要用来存储包括照片和艺术图在内的图像的文件格式。它最初由Aldus公司与微软公司一起为PostScript打印开发。
TIFF(".tiff", "image/tiff"),
FAX(".fax", "image/fax"),
ICO(".ico", "image/x-icon"),
JFIF(".jfif", "image/jpeg"),
JPE(".jpe", "image/jpeg"),
NET(".net", "image/pnetvue"),
WBMP(".wbmp", "image/vnd.wap.wbmp");
//如果有其他的mime类型,
/**
* 后缀名
*/
final String mSuffix;
final String mMIME;
ImageTypeUtil(String suffix, String mime) {
this.mSuffix = suffix;
this.mMIME = mime;
}
public static String getSuffixFromUrl(String url) {
for (ImageTypeUtil fileType : values()) {
if (url.contains(fileType.suffix())) {
return fileType.suffix();
}
}
String contentType = getMIMETypeFromUrl(url);
if (contentType == null) return null;
return mimeMapingSuffix(contentType);
}
public static String getMIMETypeFromUrl(String url) {
if (url == null || url.isEmpty()) {
return null;
}
return URLConnection.guessContentTypeFromName(url);
}
/**
* mime类型对应的后缀名
*/
public static String mimeMapingSuffix(String mime) {
for (ImageTypeUtil fileType : values()) {
if (fileType.mime().equals(mime)) {
return fileType.suffix();
}
}
return null;
}
public String mime() {
return mMIME;
}
/**
* 获取后缀名 * * @return 指定类型的后缀名,如'.mp4'
*/
public String suffix() {
return this.mSuffix;
}
}