使用第三方组件实现上传文件功能需要在项目lib下目录导入两个Jar包(commons-fileupload 和 commons-io)
commons-io下载地址:http://commons.apache.org/proper/commons-io/download_io.cgi
commons-fileupload下载地址:http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
关键步骤:
- 在JSP文件中使用page指令导入Commons-FileUpload组件所需的类
- 判断请求信息中的内容是否是multipart类型,如果是则进行处理
- 通过FileItemFactory工厂对象实例化ServletFileUpload对象
- 调用ServletFileUpload对象的parseRequest()将表单中字段解析成FileItem对象的集合
- 通过迭代依次处理每个FileItem对象,如果是普通字段,通过getString()方法得到相应表单字符的值,该值与表单字段中的"name"属性对应,如果是文件字段,则通过File的构造方法构建一个指定路径名和文件名的文件,并通过FileItem对象的Write()的方法将上传文件的内容保存到文件中
示例代码:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="doindex.jsp" enctype="multipart/form-data" method="post">
姓名:<input type="text" name="username">
<input type="file" name="filename">
<input type="submit" value="提交">
</form>
</body>
</html>
处理index.jsp请求的doindex.jsp页面
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
request.setCharacterEncoding("utf-8");
String uploadFileName="";//上传的文件名
String fieldName="";//表单字段name的属性值
//请求信息中的内容是否是multipart类型
boolean isMultipart=ServletFileUpload.isMultipartContent(request);
//上传文件的储存路径(服务器文件系统上的绝对文件路径)
String uploadFilePath=request.getSession().getServletContext().getRealPath("upload/");
if(isMultipart){
FileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
try{
List<FileItem> items=upload.parseRequest(request);
Iterator<FileItem> iter=items.iterator();
while(iter.hasNext()){
FileItem item=(FileItem)iter.next();
if(item.isFormField()){ //普通表单字段
fieldName=item.getFieldName();
if(fieldName.equals("username")){
out.print(item.getString("utf-8")+"上传了文件!");
}
}else{ //文件表单字段
String fileName=item.getName();
if(fileName!=null && !fileName.equals("")){
File fullFile=new File(item.getName());
File saveFile=new File(uploadFilePath,fullFile.getName());
item.write(saveFile);
uploadFileName=fullFile.getName();
out.print("上传成功后的文件名是:"+uploadFileName);
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'doindex.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
</body>
</html>