在web应用中,要实现一个上传文件的功能,使用Servlet+commons-fileupload包的组合方式。
需要包:commons-fileupload.jar commons-io.jar
这个commons-fileupload其实在struts2等一些框架中都集成好了的,相应地一些配置可以在struts2等框架的配置文件xml中进行设定,比如文件上传大小限制等。
如果没有使用这些框架,只是纯粹的servlet,那么设定上传文件大小等操作是需要手工在servlet中设定的。
相应的doPost方法,我是这样写的:
//创建硬盘工厂,用于配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();
//设定上传文件的存储路径
factory.setRepository(uploadPath);
//创建上传文件组件handler
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");//防乱码
//设定上传文件大小为10MB
//如果不设定,默认值为-1表示无限大
final long MAX_SIZE=1024*1024*10;
upload.setFileSizeMax(MAX_SIZE);
//获取上传的文件,如果超过指定大小那么提示出错
List<FileItem> items = null;
// Parse the request
try{
items = upload.parseRequest(request);
} catch (FileUploadException e) {// 处理文件尺寸过大异常
if (e instanceof FileSizeLimitExceededException) {
out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />");
out.println("<a href=\"index.html\" target=\"_top\">返回</a>");
return;
}
e.printStackTrace();
}
//文件大小正常,那么逐一处理
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (!item.isFormField()) {
String filename=item.getName();//文件名
String value=item.getString("UTF-8");//文件内容
String contentType=item.getContentType();//文件类型
boolean isInMemory=item.isInMemory();//文件是否在内存中
long sizeInBytes=item.getSize();//文件大小
//保存文件:项目部署根路径+上传文件存储目录+文件名
item.write(new File(uploadPath, filename));
//begin:替换当前系统的换行符为<br/>
String lineSeparator = System.getProperty("line.separator");
String result=value.replaceAll(lineSeparator, "<br/>");
//end
//输出所上传文件的信息
out.print("filename:"+filename+"<br/>"+
"contentType:"+contentType+"<br/>"+
"isInMemory:"+isInMemory+"<br/>"+
"sizeInBytes:"+sizeInBytes+"<br/>");
}
}
} catch(Exception e){
e.printStackTrace();
RequestDispatcher dispatcher = request.getRequestDispatcher("/error.html");
dispatcher.forward(request, response);
}