Servlet中文件上传
1.注册页面(jsp文件),将表单信息提交给MyFileUploadServlet处理
<%@ pagelanguage="java" contentType="text/html;charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/uploadFile" method="post" enctype="multipart/form-data">
<input type="text" name="uname">用户名
<input type="password" name="pswd">密码
<input type="file" name="picture">上传头像
<input type="submit" value="注册">
</form>
</body>
</html>
2.所需jar包
3.MyFileUploadServlet
public classMyFileUploadServlet extends HttpServlet {
@Override
protected voiddoGet(HttpServletRequest req, HttpServletResponse resp)
throwsServletException, IOException {
//设置文件保存路径
String savePath =getServletContext().getRealPath("/WEB-INF/filesave");
//创建文件对象
File f = newFile(savePath);
//判断该文件是否存在或是否是文件夹
if(!f.exists()|| !f.isDirectory()){
f.mkdir();
}
//创建DiskFileItemFactory对象
DiskFileItemFactoryfac = new DiskFileItemFactory();
//创建上传文件解析对象
ServletFileUploadupload = new ServletFileUpload(fac);
//处理上传文件的乱码问题
upload.setHeaderEncoding("UTF-8");
//判断请求过来的内容是不是上传数据的
if(!ServletFileUpload.isMultipartContent(req)){//不是上传文件的表单
return;//直接返回
}
try {
//解析上传的文件,返回的是一个List<FileItem>
List<FileItem>list = upload.parseRequest(req);
//遍历list
for(FileItemi:list){
//判断是不是普通的字段
if(i.isFormField()){//是普通的字段
//直接获取字段名及对应的值
String name =i.getFieldName();
String value= i.getString();
System.out.println(name+" : "+value);
}else{//获得的是上传文件
//获取上传文件的文件名
Stringfilename = i.getName();
//在IE浏览器中得到的是绝对路径,需要截取文件名
filename =filename.substring(filename.lastIndexOf("\\")+1);
//生成一个随机序列号
String id =UUID.randomUUID().toString();
//与文件名拼接成一个新的文件名
filename =id+filename;
//获取文件输入流对象
InputStreamin = i.getInputStream();
//创建输出流对象(文件路径是最前面定义过的文件夹路径加上读取到的上传文件的名称)
OutputStreamout = new FileOutputStream(savePath+File.separator+filename);
//定义字节数组
byte[] b = new byte [2048];
//定义返回读取数据的长度变量
intlen = 0;
//读入写出数据
while((len=in.read(b))!= -1){//说明读取到的有内容
out.write(b,0, len);//写入
}
//关闭输入输出流
in.close();
out.close();
}
}
} catch(FileUploadException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
@Override
protected voiddoPost(HttpServletRequest req, HttpServletResponse resp)
throwsServletException, IOException {
doGet(req,resp);
}
}
4.配置文件
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>lianxi.MyFileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/uploadFile</url-pattern>
</servlet-mapping>