commons-fileupload.jar这个组件来自阿帕奇,可方便的实现文件的上传,(要有commons-io.jar的支持)
commons-fileupload这个组件主要有三个经常用到的类,一个是DiskFileItemFactory,它的作用主要是用来设置缓存和临时文件目录,因为文件大小不同,当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。它可以设置将文件保存在内存还是磁盘上的临界值,也可以设置最大可上传的临界值,以及临时目录的具体路径
FileItem类
这是一个接口,主要用来对具体的上传列表内容。
boolean isFormField()用来判断是否是普通文本表单还是文件表单。
String getName()用来返回该文件的名称,这个名字包括路径
void write(FIle file)用于将该文件写到某个具体文件路径里。
还有一些具体的方法通过名字就可以知道具体的功能。
ServletFileUpload类
ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不需要管底层实现,暴露给用户的简单易用的接口),主要用到parseRequest(HttpServletRequest)返回一个list<FileItem>,具体使用FileItem来进行具体的上传操作。
主要的上传代码:
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(5*1024); //最大缓存
factory.setRepository(new File(serverPath+tempPath));//临时文件目录
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(sizeMax*1024*1024);//文件最大上限
String filePath = null;
try {
List<FileItem> items = upload.parseRequest(request);//获取所有文件列表
for (FileItem item : items) {
//获得文件名,这个文件名包括路径
if(!item.isFormField()){
//文件名
String fileName = item.getName().toLowerCase();
if(fileName.endsWith(fileType[0])||fileName.endsWith(fileType[1])||fileName.endsWith(fileType[2])||fileName.endsWith(fileType[3])||fileName.endsWith(fileType[4])||fileName.endsWith(fileType[5])){
String uuid = UUID.randomUUID().toString();
filePath = serverPath+uploadPath+uuid+fileName.substring(fileName.lastIndexOf("."));
item.write(new File(filePath));
PrintWriter pw = response.getWriter();
String returnvalue= uploadPath+uuid+fileName.substring(fileName.lastIndexOf("."));
pw.write("<script>alert('"+returnvalue+"');window.returnValue='"+returnvalue+"';window.close();</script>");
pw.flush();
pw.close();
}else{
request.setAttribute("errorMsg", "上传失败,请确认上传的文件存在并且类型是图片!");
request.getRequestDispatcher("index.jsp").forward(request,
response);
}
}
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("errorMsg", "上传失败,请确认上传的文件大小不能超过"+sizeMax+"M");
request.getRequestDispatcher("index.jsp").forward(request,
response);
}
}
else
{
PrintWriter out = response.getWriter();
out.write("<script>alert('the type of request does not match')</script>");
}