Servlet文件上传——用commons-fileupload包

在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);
  }


你可能感兴趣的:(Servlet文件上传——用commons-fileupload包)