1)情况:网上某些人,居然通过文件名.后缀来判断文件类型,这样太不安全了,万一别人有心修改文件后缀名称,岂不是。。。
所以为了防止这样情况,判断文件的实际类型,做了该文章,若有错误或不足,请指出讨论,非常感谢!
OK,废话少说,直接主题,show me the code!
2)代码:
2.1)通过枚举类,管理不同类型文件的文件头(具体每个文件的文件头内容,可以通过UltraEdit工具打开,查看其16进制内容)
package org.hyena.ats.util;
/**
* 文件类型
* @author zhihao.du
*
*/
public enum FileType {
/**
* JEPG.
*/
JPEG("FFD8FF"),
/**
* PNG.
*/
PNG("89504E47"),
/**
* GIF.
*/
GIF("47494638"),
/**
* TIFF.
*/
TIFF("49492A00"),
/**
* Windows Bitmap.
*/
BMP("424D"),
/**
* CAD.
*/
DWG("41433130"),
/**
* Adobe Photoshop.
*/
PSD("38425053"),
/**
* Rich Text Format.
*/
RTF("7B5C727466"),
/**
* XML.
*/
XML("3C3F786D6C"),
/**
* HTML.
*/
HTML("68746D6C3E"),
/**
* CSS.
*/
CSS("48544D4C207B0D0A0942"),
/**
* JS.
*/
JS("696B2E71623D696B2E71"),
/**
* Email [thorough only].
*/
EML("44656C69766572792D646174653A"),
/**
* Outlook Express.
*/
DBX("CFAD12FEC5FD746F"),
/**
* Outlook (pst).
*/
PST("2142444E"),
/**
* MS Word/Excel.
* XLS_DOC:ppt,doc,xls
* XLSX_DOCX:xlsx
*/
XLS_DOC("D0CF11E0"), XLSX_DOCX("504B030414000600080000002100"),
/**
* Visio
*/
VSD("d0cf11e0a1b11ae10000"),
/**
* MS Access.
*/
MDB("5374616E64617264204A"),
/**
* WPS文字wps、表格et、演示dps都是一样的
*/
WPS("d0cf11e0a1b11ae10000"),
/**
* torrent
*/
TORRENT("6431303A637265617465"),
/**
* WordPerfect.
*/
WPD("FF575043"),
/**
* Postscript.
*/
EPS("252150532D41646F6265"),
/**
* Adobe Acrobat.
*/
PDF("255044462D312E"),
/**
* Quicken.
*/
QDF("AC9EBD8F"),
/**
* Windows Password.
*/
PWL("E3828596"),
/**
* ZIP Archive.
*/
ZIP("504B0304"),
/**
* RAR Archive.
*/
RAR("52617221"),
/**
* JSP Archive.
*/
JSP("3C2540207061676520"),
/**
* JAVA Archive.
*/
JAVA("7061636B61676520"),
/**
* CLASS Archive.
*/
CLASS("CAFEBABE0000002E00"),
/**
* JAR Archive.
*/
JAR("504B03040A000000"),
/**
* MF Archive.
*/
MF("4D616E69666573742D56"),
/**
*EXE Archive.
*/
EXE("4D5A9000030000000400"),
/**
*CHM Archive.
*/
CHM("49545346030000006000"),
/**
* Wave.
*/
WAV("57415645"),
/**
* AVI.
*/
AVI("41564920"),
/**
* Real Audio.
*/
RAM("2E7261FD"),
/**
* Real Media.
*/
RM("2E524D46"),
/**
* MPEG (mpg).
*/
MPG("000001BA"),
/**
* Quicktime.
*/
MOV("6D6F6F76"),
/**
* Windows Media.
*/
ASF("3026B2758E66CF11"),
/**
* MIDI.
*/
MID("4D546864"),
/**
* MP4.
*/
MP4("00000020667479706d70"),
/**
* MP3.
*/
MP3("49443303000000002176"),
/**
* FLV.
*/
FLV("464C5601050000000900"),
/**
* TXT:txt,docx
*/
TXT("0000000000000000000000000000");
private String value = "";
/**
* Constructor.
*
* @param type
*/
private FileType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
2.2)操作枚举类:
package org.hyena.ats.util;
import java.io.IOException;
import java.io.InputStream;
/**
* 文件类型操作类
* @author zhihao.du
*
*/
public final class FileTypeJudge {
/**
* Constructor
*/
private FileTypeJudge() {
}
/**
* 将文件头转换成16进制字符串
* @param 原生byte
* @return 16进制字符串
*/
private static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
/**
* 得到文件头
* @param filePath 文件路径
* @return 文件头
* @throws IOException
*/
private static String getFileContent(InputStream is) throws IOException {
byte[] b = new byte[28];
InputStream inputStream = null;
try {
is.read(b, 0, 28);
} catch (IOException e) {
e.printStackTrace();
throw e;
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
}
return bytesToHexString(b);
}
/**
* 获取文件类型类
* @param filePath 文件路径
* @return 文件类型
*/
public static FileType getType(InputStream is) throws IOException {
String fileHead = getFileContent(is);
if (fileHead == null || fileHead.length() == 0) {
return null;
}
fileHead = fileHead.toUpperCase();
FileType[] fileTypes = FileType.values();
for (FileType type : fileTypes) {
if (fileHead.startsWith(type.getValue())) {
return type;
}
}
return null;
}
/**
* 获取文件类型
* @param is
* @return
* @throws Exception
*/
public static String getFileType(InputStream is) throws Exception{
FileType fileType = getType(is);
if(fileType!=null){
return fileType.getValue();
}
return null;
}
}
2.3)判断接口
/**
* 判断文件格式
* @param file
* @return
*/
public static boolean checkFileFormat(MultipartFile file) {
if (file == null) {
return false;
}
try {
String type = FileTypeJudge.getFileType(file.getInputStream());
if(FileType.TXT.getValue().equals(type)){//TXT,DOCX
return true;
}
if(FileType.XLS_DOC.getValue().equals(type)){//PPT,DOC,XLS
return true;
}
if(FileType.XLSX_DOCX.getValue().equals(type)){//XLSX
return true;
}
if(FileType.PDF.getValue().equals(type)){//PDF
return true;
}
if(FileType.PNG.getValue().equals(type)){//PNG
return true;
}
if(FileType.JPEG.getValue().equals(type)){//JPG
return true;
}
}catch (Exception e) {
e.printStackTrace();
return false;
}
return false;
}
文章参考: