一、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有以下构造方法:
- MyUpload(javax.servlet.http.HttpServletRequest request),用于实例化工具类
有以下方法:
- setExtension(java.lang.String ext, java.lang.String sign),用于设置允许上传文件的后缀名
- setMaxSize(int maxSize),用于设置允许上传文件的最大大小
- setHeaderEncoding(java.lang.String encoding),用于设置上传文件的编码格式
- setBuffer(int size),用于设置文件缓存大小
- initialize(),用于初始化工具类的设置
- getValue(java.lang.String name),用于获取普通表单文本
- 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); } }
五、使用实例
<!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
<%@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。