分享

Java文件上传类FileUploadUtil.java代码+注释

 昵称21365845 2015-06-04

一个通用的Java文件上传类,支持上传图片,支持生成缩略图,设置最大上传文件字节数,不设置时默认10M,可接收来自表单的数据,当有多个文件域时,只上传有文件的,忽略其他不是文件域的所有表单信息,支持用户对上传文件大小,字节进行设置,本上传类可过滤掉以下文件类型:".exe", ".com", ".cgi", ".asp", ".php", ".jsp"等,你可自已添加过滤的文件后缀,上传文件时如果没有上传目录,则自动创建它。。。

package com.gootrip.util;
import java.io.File;
import java.util.*;
import org.apache.commons.fileupload.*;
import javax.servlet.http.HttpServletRequest;
import java.util.regex.Pattern;
import java.io.IOException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import java.util.regex.Matcher;
/**
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class FileUploadUtil {
    //当上传文件超过限制时设定的临时文件位置,注意是绝对路径
    private String tempPath = null;
    //文件上传目标目录,注意是绝对路径
    private String dstPath = null;
    //新文件名称,不设置时默认为原文件名
    private String newFileName = null;
    //获取的上传请求
    private HttpServletRequest fileuploadReq = null;
    //设置最多只允许在内存中存储的数据,单位:字节,这个参数不要设置太大
    private int sizeThreshold = 4096;
    //设置允许用户上传文件大小,单位:字节
    //共10M
    private long sizeMax = 10485760;
    //图片文件序号
    private int picSeqNo = 1;
    private boolean isSmallPic = false;
    public FileUploadUtil(){
    }
    public FileUploadUtil(String tempPath, String destinationPath){
        this.tempPath  = tempPath;
        this.dstPath = destinationPath;
    }
    public FileUploadUtil(String tempPath, String destinationPath, HttpServletRequest fileuploadRequest){
        this.tempPath   = tempPath;
        this.dstPath = destinationPath;
        this.fileuploadReq = fileuploadRequest;
    }
    /** 文件上载
     * @return true —— success; false —— fail.
     */
    public boolean Upload(){
        DiskFileItemFactory factory = new DiskFileItemFactory();
        try {
            //如果没有上传目的目录,则创建它
            FileUtil.makeDirectory(dstPath+"/ddd");
            /*if (!FileUtil.makeDirectory(dstPath+"/ddd")) {
                throw new IOException("Create destination Directory Error.");
            }*/
            //如果没有临时目录,则创建它
            FileUtil.makeDirectory(tempPath+"/ddd");
            /*if (!FileUtil.makeDirectory(tempPath+"/ddd")) {
                throw new IOException("Create Temp Directory Error.");
            }*/
            //上传项目只要足够小,就应该保留在内存里。
            //较大的项目应该被写在硬盘的临时文件上。
            //非常大的上传请求应该避免。
            //限制项目在内存中所占的空间,限制最大的上传请求,并且设定临时文件的位置。
            //设置最多只允许在内存中存储的数据,单位:字节
            factory.setSizeThreshold(sizeThreshold);
            // the location for saving data that is larger than getSizeThreshold()
            factory.setRepository(new File(tempPath));
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置允许用户上传文件大小,单位:字节
            upload.setSizeMax(sizeMax);
            List fileItems = upload.parseRequest(fileuploadReq);
            Iterator iter = fileItems.iterator();
            //  正则匹配,过滤路径取文件名
            String regExp = ".+\\\\(.+)$";
            //  过滤掉的文件类型
            String[] errorType = {".exe", ".com", ".cgi", ".asp", ".php", ".jsp"};
            Pattern p = Pattern.compile(regExp);
            while (iter.hasNext()) {
                System.out.println("++00++====="+newFileName);
                FileItem item = (FileItem) iter.next();
                //忽略其他不是文件域的所有表单信息
                if (!item.isFormField()) {
                    String name = item.getName();
                    System.out.println("++++====="+name);
                    long size = item.getSize();
                    //有多个文件域时,只上传有文件的
                    if ((name == null || name.equals("")) && size == 0)
                        continue;
                    Matcher m = p.matcher(name);
                    boolean result = m.find();
                    if (result) {
                        for (int temp = 0; temp < errorType.length; temp++) {
                            if (m.group(1).endsWith(errorType[temp])) {
                                throw new IOException(name + ": Wrong File Type");
                            }
                        }
                        String ext = "."+FileUtil.getTypePart(name);
                        try {
                            //保存上传的文件到指定的目录
                            //在下文中上传文件至数据库时,将对这里改写
                            //没有指定新文件名时以原文件名来命名
                            if (newFileName == null || newFileName.trim().equals(""))
                            {
                                item.write(new File(dstPath +"/"+ m.group(1)));
                            }
                            else
                            {
                                String uploadfilename = "";
                                if (isSmallPic)
                                {
                                    uploadfilename = dstPath +"/"+ newFileName+"_"+picSeqNo+"_small"+ext;
                                }
                                else
                                {
                                    uploadfilename = dstPath +"/"+ newFileName+"_"+picSeqNo+ext;
                                }
                                //生成所有未生成的目录
                                System.out.println("++++====="+uploadfilename);
                                FileUtil.makeDirectory(uploadfilename);
                                //item.write(new File(dstPath +"/"+ newFileName));
                                item.write(new File(uploadfilename));
                            }
                            picSeqNo++;
                            //out.print(name + "  " + size + "");
                        } catch (Exception e) {
                            //out.println(e);
                            throw new IOException(e.getMessage());
                        }
                    } else {
                        throw new IOException("fail to upload");
                    }
                }
            }
        } catch (IOException e) {
            System.out.println(e);
        } catch (FileUploadException e) {
            System.out.println(e);
        }
        return true;
    }
    /**从路径中获取单独文件*/
    public String GetFileName(String filepath)
    {
        String returnstr = "*.*";
        int length       = filepath.trim().length();
        filepath = filepath.replace('\\', '/');
        if(length >0)
        {
            int i = filepath.lastIndexOf("/");
            if (i >= 0)
            {
                filepath  = filepath.substring(i + 1);
                returnstr = filepath;
            }
        }
        return returnstr;
    }
    /**
     * 设置临时存贮目录
     */
    public void setTmpPath(String tmppath)
    {
        this.tempPath = tmppath;
    }
    /**
     * 设置目标目录
     */
    public void setDstPath(String dstpath) {
        this.dstPath = dstpath;
    }
    /**
     * 设置最大上传文件字节数,不设置时默认10M
     */
    public void setFileMaxSize(long maxsize) {
        this.sizeMax = maxsize;
    }
    /**
     * 设置Http 请求参数,通过这个能数来获取文件信息
     */
    public void setHttpReq(HttpServletRequest httpreq) {
        this.fileuploadReq = httpreq;
    }
    /**
     * 设置Http 请求参数,通过这个能数来获取文件信息
     */
    public void setNewFileName(String filename) {
        this.newFileName = filename;
    }
    /**
     * 设置此上传文件是否是缩略图文件,这个参数主要用于缩略图命名
     */
    public void setIsSmalPic(boolean isSmallPic) {
        this.isSmallPic = isSmallPic;
    }
    /**
     * 设置Http 请求参数,通过这个能数来获取文件信息
     */
    public void setPicSeqNo(int seqNo) {
        this.picSeqNo = seqNo;
    }
}

 可保存上述代码为类文件,用在JAVA或JSP程序中,Java开发的朋友们,应该会轻易使用它。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多