根据commons-fileupload制作的个人上传工具类

一、Fileupload上传组件介绍

FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,相关文件可以在http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi下载,在使用FileUpload时需要将表单Form文件的enctype属性设置为multipart/form-data,method设置为POST方式提交,提交后在后台处理的jsp文档不能像普通文档使用request.getString()方法获得表单的值,而需要通过FileUpload组件进行文件获取。

FileUpload组件使用硬盘文件工厂(DiskFileItemFactory)对文件的保存操作进行设置,表单的内容通过servletFileUpload.parseRequest(request)方法进行获取,获取后得到的内容以FileItem的格式处理,FileItem可以通过isFormField()方法判断内容是普通文档还是上传文件,并通过不同方式让程序员进行操作。


二、制作目的

作为个懒虫,在jsp页面进行文件的获取是件麻烦的事,特别是commons-fileupload功能强大,有很多要设置,开始时理解了很久,在实际使用中不容易操作,所以制作了这个工具类,方便日后使用。

刚接触javaWEB,如果有错误还请各位指出,一起学习~


三、API文档

相关的API文档和源代码已经上传的到CSDN,免费下载,不用积分。

下载地址为:http://download.csdn.net/download/z_haisome/9699359


该工具类主类MyUpload有以下构造方法:

  1. MyUpload(javax.servlet.http.HttpServletRequest request),用于实例化工具类

有以下方法:

  1. setExtension(java.lang.String ext, java.lang.String sign),用于设置允许上传文件的后缀名
  2. setMaxSize(int maxSize),用于设置允许上传文件的最大大小
  3. setHeaderEncoding(java.lang.String encoding),用于设置上传文件的编码格式
  4. setBuffer(int size),用于设置文件缓存大小
  5. initialize(),用于初始化工具类的设置
  6. getValue(java.lang.String name),用于获取普通表单文本
  7. getFile(java.lang.String fileName, java.lang.String savePath, java.lang.String saveName),用于获取上传文件


四、源代码

工具类共有一个主类,四个异常类。异常类用于给程序员获取异常后给用户提示。

主类:MyUpload.java
作用:实现文件上传

package HaiSome;

import java.util.*;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.FileUploadBase.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspWriter;

/**
 * 根据commons-fileupload制作的上传工具类,适用于jsp文档
 * @author ZHaiS
 */
public class MyUpload {
    //默认上传文件限制大小,默认为1M
    private long max_size = 1*1024*1024;
    //上传缓存,默认为10*1024,即10K
    private int uploadBuffer = 10*1024; 
    //上传文件的编码格式,默认为UTF-8
    private String HeaderEncoding = "utf-8";
    //获取客户端请求
    private HttpServletRequest request = null;
    private JspWriter out = null;
    //允许上传文件后缀集合
    private ArrayList<String> allowedExt = new ArrayList<String>();
    //从request得到所有上传域的列表
    private List<FileItem> fileItemsList = null;

    /**
     * 无参构造函数,初始化上传工具类,获取客户端的request
     * @param request 客户端表单请求
     */
        public MyUpload(HttpServletRequest request){
        this.request = request;
    }

    /**
     * 初始化上传工具,检查表单是否为MultipartContent,当表单为MultipartContent时进行操作,
     * 设置文件上传缓存大小、上传文件编码格式、上传最大尺寸限制,如果没有进行相关设置则使用默认值,
     * 请在设置以上相关值(如有需要)之后、读取表单文件之前调用该方法,进行初始化
     * @throws ExceedException 超出上传文件限制大小时将抛出
     */
        public void initialize() throws ExceedException{
        if(ServletFileUpload.isMultipartContent(request)){
            //实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //设置上传文件时用于临时存放文件的内存大小,多于的部分将临时存放在硬盘,上传时一点一点地上传
            //先传向内存,多于缓存大小的逐渐拉到硬盘临时文件夹中,待上传完毕,就从临时文件夹移到目标文件夹。不设置则为默认值.
            factory.setSizeThreshold(uploadBuffer);
            //用DiskFileItemFactory工厂实例化上传组件
            ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
            //设置上传文件编码格式,默认值为UTF-8
            servletFileUpload.setHeaderEncoding(HeaderEncoding);
            //设置最大上传尺寸
            servletFileUpload.setSizeMax(max_size);
            try {
                fileItemsList = servletFileUpload.parseRequest(request);
            } catch (FileUploadException ex) {
                Logger.getLogger(MyUpload.class.getName()).log(Level.SEVERE, null, ex);
                if(ex instanceof SizeLimitExceededException){
                    throw new ExceedException("Exception:File out of limit size");
                }
            }
        }
    }

    /**
     * 设置上传文件限制大小,如10K,则参数为10*1024*1024
     * @param maxSize 需要设置的最大上传文件尺寸,超出该尺寸上传将报错
     */
        public void setMaxSize(int maxSize){
        max_size = maxSize;
    }
        
    /**
     * 设置表单文件编码格式,默认编码格式为UTF-8
     * @param encoding 用户自定义的表单文件编码格式
     */
        public void setHeaderEncoding(String encoding){
        HeaderEncoding = encoding;
    }
        
    /**
     * 设置允许上传文件的后缀名。
     * 参数中的后缀名用自定义分隔符间隔,如字符串为"gif,png,jpg",分隔符为",",则允许的后缀名为gif、png、jpg。
     * 不设置则默认全部格式文件都可以上传。
     * @param ext 后缀名列表,用自定义分隔符隔开
     * @param sign 自定义分隔符
     */
        public void setExtension(String ext ,String sign){
        String[] extArray = ext.split(sign);
        allowedExt.addAll(Arrays.asList(extArray));
    }

    /**
     * 设置上传文件时用于临时存放文件的内存大小,多余的部分将临时存放在硬盘,
     * 上传时一点一点地上传先传向内存,多于缓存的逐渐拉到硬盘临时文件夹中,
     * 待上传完毕,就从临时文件夹移到目标文件夹。不设置则为默认10240.
     * 如4K则size为4*1024
     * @param size 用户自定义缓存大小
     */
        public void setBuffer(int size){
        uploadBuffer = size;
    }

    /**
     * 根据参数获得表单元素的值
     * @param name 所需要获得表单input的name属性
     * @return 以String格式返回该输入框的值
     */
        public String getValue(String name){
        String rtn = null;
        if(fileItemsList != null & !fileItemsList.isEmpty()){
            //得到所有上传的文件/普通文本域
            Iterator fileItr = fileItemsList.iterator();
            //循环处理所有文件/普通文本域
            while(fileItr.hasNext()){
                //得到当前文件/普通文本域
                FileItem item = (FileItem)fileItr.next();
                //确定是普通文本框
                if(item == null || item.isFormField()){
                    String fieldName = item.getFieldName();
                    String value = null;
                    try {
                        value = item.getString(HeaderEncoding);
                    } catch (UnsupportedEncodingException ex) {
                        Logger.getLogger(MyUpload.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    if(fieldName.equals(name) && value != null && !value.equals("")){
                            rtn = value;
                            break;
                    }
                }
            }
        }
        return rtn;
    }

    /**
     * 根据上传框名称fileName获取上传文件,并保存到指定的位置
     * @param fileName 所需要获得表单input的name属性
     * @param savePath 自定义文件保存路径,空字符串则使用默认名称
     * @param saveName 自定义文件保存名称,没有则保存为默认值,默认值为file+数字+后缀名
     * @throws UploadTypeException 上传文件类型与限定文件类型不符合异常
     * @throws FileNotFoundException 未发现上传文件或上传文件无效
     * @throws SaveException 文件保存错误,请检查保存路径或磁盘读写属性
     */
        public void getFile(String fileName, String savePath, String saveName) throws UploadTypeException, FileNotFoundException, SaveException{
        Iterator fileItr = fileItemsList.iterator();
        FileItem item_file = null;
        
        //得到对应上传输入框的文件
        while(fileItr.hasNext()){
            FileItem item = (FileItem)fileItr.next();
            if(item != null && !item.isFormField()){
                String name = item.getFieldName();
                if(fileName.equals(name)){
                    item_file = item;
                    break;
                }
            }
        }
        
        //如果有上传文件
        if(item_file != null){
            String save_Name = item_file.getName();
            //得到文件的大小
            long size = item_file.getSize();
            if(!"".equals(save_Name) & size != 0 ){
                //得到去除路径的文件名,这里的双斜杠是转义字符,转为一个斜杠
                String t_name = save_Name.substring(save_Name.lastIndexOf("\\") +1);
                //得到文件的拓展名(无拓展名时将得到全名)
                String t_ext = t_name.substring(t_name.lastIndexOf(".")+1);
                //拒绝接受规定文件格式之外的文件类型
                int allowFlag = 0;
                int allowedExtCount = allowedExt.size();
                if(allowedExtCount != 0){
                    for(;allowFlag < allowedExtCount; allowFlag++){
                            if(allowedExt.get(allowFlag).equals(t_ext))
                                break;
                    }
                    if(allowFlag == allowedExtCount){
                        throw new UploadTypeException("Exception:Disabled file type");
                    }
                }

                if("".equals(saveName)){
                    save_Name = "file"
                                +System.currentTimeMillis()
                                +save_Name.substring(save_Name.lastIndexOf("."));
                }else{
                    save_Name = saveName+save_Name.substring(save_Name.lastIndexOf("."));
                }

            }else{
                throw new FileNotFoundException("Excepiton:File is not Found");
            }
            //定义保存文件的路径
            String save_path = savePath + save_Name;
            //保存文件到服务器上
            File file = new File(request.getSession().getServletContext().getRealPath(save_path));
            if(!file.getParentFile().exists()){
                    file.getParentFile().mkdirs();
            }
            try {
                item_file.write(file);
            } catch (Exception ex) {
                throw new SaveException("Exception:File save error,check the save path");
            }
        }else{
            //没有发现上传的文件
            throw new FileNotFoundException("Excepiton:File is not Found");
        }
    }
}

异常类:ExceedException.java
作用:用于表示上传的文件超出限定的大小

package HaiSome;

/**
 *用于表示上传的文件超出限定的大小
 * @author ZHaiS
 */
public class ExceedException extends Exception{

    public ExceedException(){}

    public ExceedException(String message){
        super(message);
    }
}


异常类:FileNotFoundException.java
作用:未发现上传文件或上传文件无效

package HaiSome;

/**
 * 未发现上传文件或上传文件无效
 * @author ZHaiS
 */
public class FileNotFoundException extends Exception{

    public FileNotFoundException(){}

    public FileNotFoundException(String message){
        super(message);
    }
}


异常类:SaveException.java
作用:文件保存错误,请检查保存路径或磁盘读写属性

package HaiSome;

/**
 * 文件保存错误,请检查保存路径或磁盘读写属性
 * @author ZHaiS
 */
public class SaveException extends Exception{

    public SaveException(){}

    public SaveException(String message){
        super(message);
    }
}

异常类:UploadTypeException.java
作用:用于表示上传文件类型不符合异常

package HaiSome;

/**
 *用于表示上传文件类型不符合异常
 * @author ZHaiS
 */
public class UploadTypeException extends Exception{

    public UploadTypeException(){}

    public UploadTypeException(String message){
        super(message);
    }
}



五、使用实例

笔者使用的服务器是tomcat8.5,。
1、在tomcat的webapps文件夹下新建一个mytest文件夹,作为工程目录。



2、如上图,新建WEB-INF文件夹,并在文件夹内新建classes文件夹和lib文件夹,web.xml可以使用webapps\ROOT\WEB-INF文件夹内的.



3、将编译好的class文件放在classes内的HaiSome文件夹中,如果下载了我的上传文件,可以在里面直接复制过去



4、在lib文件夹中放入commons-fileupload的jar包,可以在官网上下载。


5、新建两个文本文档,并分别改名为UploadTest.html和UploadTest_do.jsp


6、UploadTest.html文档的内容如下:
<!DOCTYPE html>
<html>
<head>
	<title>上传工具类测试</title>
</head>
<body>
	<form action="UploadTest_do.jsp" method="POST" enctype="multipart/form-data">
		<p>文本1:<input type="text" id="text1" name="text1"/><span id="text1_tip" style="color:red;"></span></p>
		<p>文本2:<input type="text" id="text2" name="text2"/><span id="text1_tip" style="color:red;"></span></p>
		<p>文件1:<input type="file" id="file1" name="file1"/><span id="text1_tip" style="color:red;"></p>
		<p>文件2:<input type="file" id="file2" name="file2"/><span id="text1_tip" style="color:red;"></p>
		<p><input type="submit" id="submit" name="submit" value="确认"></p>
	</form>
</body>
</html>
保存,并设置文档格式为UTF-8

7、UploadTest_do.jsp的内容如下,同样设置格式为UTF-8
<%@page language="java" import="HaiSome.MyUpload" pageEncoding="UTF-8"%>
<%
	//设置字符编码为UTF-8,中文表单传参不乱码的支持
	request.setCharacterEncoding("UTF-8");
	//设置返回内容格式与编码
	response.setContentType("text/html");
	response.setCharacterEncoding("UTF-8");
	try{
		//实例化MyUpload
		MyUpload mu = new MyUpload(request);
		//设置中转缓存,可以不写
		mu.setBuffer(10*1024);
		//设置允许的后缀名,可以不写
		//mu.setExtension("jpg,jpeg,gif,png",",");
		//设置文件编码格式,默认为UTF-8
		mu.setHeaderEncoding("utf-8");
		//设置文件最大限制大小
		mu.setMaxSize(10*1024*1024);
		//初始化设置
		mu.initialize();
		//保存时自动命名文件
		mu.getFile("file1","/Test/","");
		//保存时自定义文件名
		mu.getFile("file2","/","saveFile2");
		//输出普通文本
		out.println("输入框1的文本为:"+mu.getValue("text1")+"<br/>");
		out.println("输入框2的文本为:"+mu.getValue("text2"));
	}catch(Exception e){
		//可以获取各种异常,根据异常给用户提示,这里仅控制台输入异常
		System.out.println(e);
	}
%>

8、打开tomcat,如果原来是打开的,记得重启一下tomcat。
在浏览器地址栏输入地址http://localhost:8080/mytest/UploadTest.html,这个根据个人的tomcat配置而定,默认是这个。
得到如下页面:


9、任意输入文本和选择上传文件,这里我的上传文件为两张图片,大小400KB左右

最终如下


10、操作完成
浏览器输出如图

可以在我们选择的文件夹中看到上传的图片,而且图片按照我们需要的名字命名,如图
文件1保存在mytest/Test文件夹中(上面的jsp文档设置的路径)


文件2保存在mytest中(也是jsp页面设置的路径)



这就是本次的分享~~~

猜你喜欢

转载自blog.csdn.net/z_haisome/article/details/53424780
今日推荐