Java文件上傳驗證

不光能對文件限制,還能對文件真實的類型進行限制,跟Struts2的文件上傳差不多。
package lee;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class Demo {
    
	public static void main(String[] args) throws Exception{//D0CF11E0
		File file = new File("C:\\Users\\whaty-ctj\\Desktop\\11111.zip");
		if(!(fileLastName(file).equals("doc"))){ // 如果不是指定的後綴名
			//return;
		}
		//System.out.println(getFileByFile(file));
		System.out.println(file.exists());
		FileInputStream fis = new FileInputStream(file);
		FileOutputStream fos = new FileOutputStream("E:\\xx.zip");
		// FILE_TYPE_MAP.put("doc", "D0CF11E0");
		int len = 0;
		byte[] buffer = new byte[1024*1024];
		while((len = fis.read(buffer))>0){
			fos.write(buffer,0,len);
		}
		
		fos.flush();
		fos.close();
		fis.close();
	}
	
	 public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();
    /**   
     * Created on 2010-7-1    
     * <p>Discription:[getAllFileType,常見文件頭信息]</p>   
     * @author:[[email protected]]   
     */     
    private static void getAllFileType(){
        FILE_TYPE_MAP.put("jpg", "FFD8FF"); //JPEG (jpg)
        FILE_TYPE_MAP.put("png", "89504E47"); //PNG (png)
        FILE_TYPE_MAP.put("gif", "47494638"); //GIF (gif)
        FILE_TYPE_MAP.put("tif", "49492A00"); //TIFF (tif)
        FILE_TYPE_MAP.put("bmp", "424D"); //Windows Bitmap (bmp)
        FILE_TYPE_MAP.put("dwg", "41433130"); //CAD (dwg)
        FILE_TYPE_MAP.put("html", "68746D6C3E"); //HTML (html)
        FILE_TYPE_MAP.put("rtf", "7B5C727466"); //Rich Text Format (rtf)
        FILE_TYPE_MAP.put("xml", "3C3F786D6C");
        FILE_TYPE_MAP.put("zip", "504B0304");
        FILE_TYPE_MAP.put("rar", "52617221");
        FILE_TYPE_MAP.put("psd", "38425053"); //Photoshop (psd)
        FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A"); //Email [thorough only] (eml)
        FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F"); //Outlook Express (dbx)
        FILE_TYPE_MAP.put("pst", "2142444E"); //Outlook (pst)
        FILE_TYPE_MAP.put("xls", "D0CF11E0"); //MS Word
        FILE_TYPE_MAP.put("doc", "D0CF11E0"); //MS Excel 注意:word 和 excel的文件頭一樣
        FILE_TYPE_MAP.put("mdb", "5374616E64617264204A"); //MS Access (mdb)
        FILE_TYPE_MAP.put("wpd", "FF575043"); //WordPerfect (wpd)
        FILE_TYPE_MAP.put("eps", "252150532D41646F6265");
        FILE_TYPE_MAP.put("ps", "252150532D41646F6265");
        FILE_TYPE_MAP.put("pdf", "255044462D312E"); //Adobe Acrobat (pdf)
        FILE_TYPE_MAP.put("qdf", "AC9EBD8F"); //Quicken (qdf)
        FILE_TYPE_MAP.put("pwl", "E3828596"); //Windows Password (pwl)
        FILE_TYPE_MAP.put("wav", "57415645"); //Wave (wav)
        FILE_TYPE_MAP.put("avi", "41564920");
        FILE_TYPE_MAP.put("ram", "2E7261FD"); //Real Audio (ram)
        FILE_TYPE_MAP.put("rm", "2E524D46"); //Real Media (rm)
        FILE_TYPE_MAP.put("mpg", "000001BA"); //
        FILE_TYPE_MAP.put("mov", "6D6F6F76"); //Quicktime (mov)
        FILE_TYPE_MAP.put("asf", "3026B2758E66CF11"); //Windows Media (asf)
        FILE_TYPE_MAP.put("mid", "4D546864"); //MIDI (mid)
    }
	
    static{
    	getAllFileType();
    }
	/**
	 * 獲取文件類型
	 * 
	 * @param file
	 * @return
	 */
	public static String getFileByFile(File file){
		String fileType = null;
		byte[] b = new byte[20];
		try{
			InputStream is = new FileInputStream(file);
			is.read(b);
			fileType = getFileTypeByStream(b);
			is.close();
		}catch(Exception e){
			e.printStackTrace(); // 錯誤信息
		}
		return fileType;
	}
	
	/* 由於每一種文件的類型都不一致,所以這個用來判斷文件類型。 */
	private static String getFileTypeByStream(byte[] b) {
		String filetypeHex = String.valueOf(getFileHexString(b));
		Iterator<Entry<String, String>> entryiterator = FILE_TYPE_MAP.entrySet().iterator();
		while (entryiterator.hasNext()){
			Entry<String,String> entry = entryiterator.next();
			String fileTypeHexValue = entry.getValue(); 
			System.out.println(fileTypeHexValue + "  ==  " + filetypeHex);
			if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {
				return entry.getKey();
			}
		}
		return null;
	}
	public final static String getFileHexString(byte[] b) {     
		StringBuilder stringBuilder = new StringBuilder();     
		if(b == null || b.length <= 0) {
			return null;
		}
		for (int i = 0; i < b.length; i++) {
			int v = b[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

	/**
	 * 獲取文件名稱的後綴。
	 * 
	 * @param file
	 * @return
	 */
	public static String fileLastName(File file){
		String fileName = file.getName();
		String result = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length());
		return result;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章