Java文件上传验证

来源:互联网 发布:微信唤醒淘宝api接口 编辑:程序博客网 时间:2024/05/17 18:47
不光能对文件限制,还能对文件真实的类型进行限制,跟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{//D0CF11E0File 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:[shixing_11@sina.com]        */         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;}}