判断上传文件类型(非通过文件后缀名称,不安全)

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;
	}

 

文章参考:

根据文件头数据判断文件类型

Java判断文件类型

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值