具体代码已移植github:https://github.com/ygj0930/MyUploadUtils  大家给我个star呀~

在前面  ()  我们提到过Javaweb开发的文件上传功能的实现,需要借助第三方jar包,并且要创建factory呀、设置临时文件区路径呀等等,十分繁琐。而作为一个开发人员,不可能每次实现文件上传时都从头到尾做那么多工序。这时候,我们可以把这些繁琐的工作封装起来,把一个个功能做成以供调用的方法。在我们实现文件上传时,只需单纯地导入工具类,然后调用相应的方法即可。因此,我们就有了文件上传工具类的构思。

文件上传工具类的实质就是,把繁琐的工作按照函数块来封装,外界通过函数名来调用函数取得结果即可。那么,我们在文件上传过程中,需要用到的常用功能有哪些呢?我这里的工具类大概实现了以下几种,还有其他更多的功能读者可以按需实现:

设定保存路径

设定缓冲路径

设定缓冲大小

设定文件类型

获取文件扩展名

验证文件类型有效性

表单内容获取:文字以键值对保存在map中。文件保存到保存目录下

获取上传的文件内容们(返回map给调用者)

下面是源码:

导入所需的类:

import java.util.*;import java.lang.*;importjava.io.File;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.servlet.http.HttpServletRequest;importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;

定义一系列备用的变量、数组、要用到的类对象、工具类的一系列构造函数等

private String[] fileTypes=null;//允许上传的文件类型们
private String dstPath=null;//文件保存路径
private long fileSizeMax=10*1024*1024;//允许上传的文件最大值
private String cachePath=null;//缓存路径
private int cacheSizeMax=5*1024*1024;//最大缓存容量
private Map textcontent;//上传表单中的文本内容用map来保存
private ServletFileUpload sfupload;//实现上传功能的主要类
private DiskFileItemFactory factory=new DiskFileItemFactory();//定义工厂来配置上传路径、缓冲区位置等
publicmyUploadUtil(){};public myUploadUtil(String dst,String cache,String[] fileTypes,long fileSizeMax,intcacheSizeMax)
{super();this.dstPath=dst;this.cachePath=cache;this.fileTypes=fileTypes;this.fileSizeMax=fileSizeMax;this.cacheSizeMax=cacheSizeMax;
}publicmyUploadUtil(String dst,String cache,String[] fileTypes)
{super();this.dstPath=dst;this.cachePath=cache;this.fileTypes=fileTypes;
}

定义setXX()方法供外界调用来设定路径值、缓存路径、文件类型等等:

public voidsetCachePath(String cachePath){this.cachePath=cachePath;
}public void setCacheSize(intsize){this.cacheSizeMax=size;
}public voidsetDstPath(String path){this.dstPath=path;
}public void setFileSize(longsize){this.fileSizeMax=size;
}public voidsetFileType(String[] types){this.fileTypes=types;
}

定义一系列功能方法:获取内容、判断文件类型合法性等等:

//获取文件扩展名
publicString getFileExt(File file){
String path=file.getName();return path.substring(path.lastIndexOf(".")+1);
}//供外界调用获取上传表单中的文本内容
public MapgetTextContent(){returntextcontent;
}//把提取到的文本内容们赋给类本身的map对象,以供外界取用
public void setTextContent(Mapmap){this.textcontent=map;
}//单例模式获取文件上传类,如果不存在则创建,存在则赋给sfuload以免重复创建
publicServletFileUpload getServletFileUpload(){if(sfupload==null){
sfupload=newServletFileUpload(factory);returnsfupload;
}else{returnsfupload;
}
}//判断文件是否为合法的类型
public booleanisFileValidate(File file){if(fileTypes==null){return true;}for(int i=0;i
}
}return false;
}//创建文件目录:用于后面根据路径来创建文件保存目录、缓存目录
public voidmakeDir(String url){
File file=newFile(url);if(!file.exists()){if(!file.mkdirs()){
System.out.println("fail to create dir!");
}
}
}

最后,定义上传方法:

//上传方法
public voidupload(HttpServletRequest request){try{if(!ServletFileUpload.isMultipartContent(request)){return;
}
makeDir(dstPath);//创建文件保存目录
makeDir(cachePath); //创建缓存目录
factory.setRepository(new File(cachePath));//设置缓存路径
factory.setSizeThreshold(cacheSizeMax);//设置缓存大小
ServletFileUpload sfu=getServletFileUpload();//获取上传类
sfu.setFileSizeMax(fileSizeMax);//设置上传文件允许的最大值
List items=sfu.parseRequest(request);//提取请求中附带的文件们
Map map =new HashMap();//创建一个map对象来提取上传表单中的文本内容//迭代提取上传的文件们
Iterator it=items.iterator();while(it.hasNext()){
FileItem fileItem=(FileItem)it.next();if(fileItem.isFormField()){//如果是文本内容,则提取出来放进map里
map.put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
}else{//如果不是文本,则为文件
String path=fileItem.getName();//获取文件名
long size=fileItem.getSize();//获取文件大小
if ("".equals(path) || size == 0) {//无效文件的判断
System.out.println("not validate file");return;
}
File file=new File(dstPath,new File(fileItem.getName()).getName());//根据文件名在文件保存路径下创建一个同名文件
if(!isFileValidate(file)){//判断文件类型是否合法
System.out.println("file type incorrect!");
}else{
fileItem.write(file);//文件合法,则通过IO流把上传文件写到文件路径下
}
}
}
setTextContent(map);//表单文本内容提取完毕,把map中的内容set给类中的textContent对象。
}catch(Exception ex){
System.out.println(ex);
}
}

使用工具类:

下面,我们来简单试试在实际应用中使用我们封装好的文件上传工具类:

//定义允许上传的文件类型
final String allowedExt[] ={"JPG","GIF"};//获取web应用在web服务器上的绝对路径,用来保存文件
String realwebbase = request.getSession().getServletContext().getRealPath("/");//文件保存目录下创建临时文件保存目录
String temp_file = realwebbase+"upload\\UploadTemp";
myUploadUtil myupload=new myUploadUtil(realwebbase,temp_file,allowedExt);//创建文件上传工具类对象,把文件保存路径等作为参数初始化该对象
myupload.upload(request);//对象调用upload方法实现上传功能
%>