1)上传控件所在的form表单的method,必须为POST
因为GET方式传入的数据大小不能超过2KB,而POST没有大小限制
2)上传控件必须使用type="file"
3)表单的编码方式必须是二进制编码,<form enctype="multipart/form-data">
<form action="upload" method="post" enctype="multipart/form-data">
账号:<input type="text" name="userName"/><br/>
邮箱:<input type="text" name="email"/><br/>
头像:<input type="file" name="headImg" accept="image/*"><br/>
<input type="submit" value="注册">
</form>
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解析和检查请求:请求方式是否是POST,请求编码是否是multipart/form-data
boolean isMultipart =ServletFileUpload.isMultipartContent(req);
if(!isMultipart) {
return; //结束,不运行后面的
}
try {
//1.创建FileItemFactory对象
//FileItemFactory是用来创建FileItem对象的
//FileItem对象:form表单中的表单控件的封装
FileItemFactory factory=new DiskFileItemFactory();
//2.创建文件上传处理器
ServletFileUpload upload=new ServletFileUpload(factory);
//解决上传表单乱码问题
upload.setHeaderEncoding("utf-8");
//3.解析请求
List<FileItem> items=upload.parseRequest(req);
//4.迭代出每一个FileItem
for(FileItem item:items) {
String fieldName=item.getFieldName();//获取表单控件的name属性值(参数名)
if(item.isFormField()) {
//普通的表单控件
String value=item.getString("utf-8");
System.out.println(fieldName+"-"+value);
}else {
//表单上传控件
System.out.println(fieldName+"-"+item.getName());
item.write(new File(item.getName()));//把二进制数据写到哪一个文件中"
}
}
}catch(Exception e){
e.printStackTrace();
}
}
注意点:
1)文件名处理
IE6问题:通过FileItem.getName方法获取上传文件的名称,此时会带有路径
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
也可以使用FilenameUtils.getName(item.getName());
上传文件名称:给上传文件起唯一的名称:UUID
2)上传文件的保存路径:一般的,把上传文件保存到应用里面
String fileName=UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(item.getName());
String dir=super.getServletContext().getRealPath("/upload");
item.write(new File(dir,fileName));//把二进制数据写到哪一个文件中
它最后存在这里
缓存大小和临时目录
超过多少就不直接存放内存了(缓存大小):默认值是10KB
不放在内存,会放在哪个位置(临时目录):默认是Tomcat根/temp目录,不建议修改
factory.setSizeThreshold(20*2014); //20kb
//设置缓存大小
factory.setRepository(repository);
//设置临时目录