@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判断请求是否为Multipart请求
if(!ServletFileUpload.isMultipartContent(req)){
throw new RuntimeException("当前请求不支持文件上传");
}
try {
//创建一个FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置使用临时文件的边界值,大于该值,上传文件会先保存在临时问价中,否则上传文件将直接写入内存
//单位:字节
factory.setSizeThreshold(1024*1024);
//设置临时文件
String tempPath = this.getServletContext().getRealPath("/temp");
File temp = new File(tempPath);
factory.setRepository(temp);
//创建文件上传核心组件
ServletFileUpload upload = new ServletFileUpload(factory);
//设置item的头部字符编码,可以解决文件名的中文乱码问题
upload.setHeaderEncoding("UTF-8");
//设置单个上传文件的最大边界值为2M
upload.setFileSizeMax(1024*1024*2);
//设置一次上传所有文件的总和最大值为5M(对于上传多个文件时起作用)
upload.setSizeMax(1024*1024*5);
//解析请求,获取所有的item
List<FileItem> items = upload.parseRequest(req);
//遍历items
for(FileItem item:items){
if(item.isFormField()){ //若item为普通表单项
String fieldName = item.getFieldName(); //获取表单项名称
String fieldValue = item.getString("UTF-8"); //获取表单项的值
System.out.println(fieldName+"="+fieldValue);
}else { //若item为文件表单项
String fileName = item.getName(); //获取上传文件原始名称
fileName = System.currentTimeMillis()+fileName;//防止上传相同名字的文件覆盖的问题
//获取输入流,其中有上传文件的内容
InputStream is = item.getInputStream();
//获取文件保存在服务器的路径
String path = this.getServletContext().getRealPath("/files");
System.out.println(path);
//获取当前系统时间(在指定的files文件加下创建子目录,以当天的时间命名)
Date date = new Date();
//格式件日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String now = sdf.format(date);
path = path + "/" +now;
//若目录不存在,则创建这个目录
File dirFile = new File(path);
if(!dirFile.exists()){
dirFile.mkdir();
}
//创建目标文件,用于保存上传文件
File descFile = new File(path,fileName);
//创建文件输出流
FileOutputStream os = new FileOutputStream(descFile);
//将输入流中的数据写到输出流中
int len = -1;
byte[] buffer = new byte[1024];
while ((len=is.read(buffer))!= -1){
os.write(buffer,0,len);
}
//关闭流
os.close();
is.close();
//删除临时文件
item.delete();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}