jsp页面
<%@ page language="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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/uploadServlet" method="post">
<input type="text" name="name"/>
<input type="file" name="photo"/><br>
<input type="file" name="photo1"/><br>
<input type="submit" value="上传">
</form>
</body>
</html>
UploadServlet
package com.bj.web.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean b = ServletFileUpload.isMultipartContent(request);
System.out.println(b);
if(!b){
throw new RuntimeException("不是多部分上传表单"); // 抛异常后不会向下进行了
}
//1.创建一个工厂 类
DiskFileItemFactory factory=new DiskFileItemFactory();
//2.核心对象
ServletFileUpload sfu=new ServletFileUpload(factory);
//6.设置文件临时文件位置(上传文件过大会产生临时文件) (在上传结束清楚临时文件)
//factory.setRepository(new File("D:/javaweb20181108"));
//7.处理文件上传的表单乱码问题
sfu.setHeaderEncoding("utf-8");
//3.解析request得到的一个表单项集合
try {
//5.限制文件上传大小
//sfu.setFileSizeMax(1024*1024*5); //单个文件大小
//sfu.setSizeMax(1024*1024*10); //总文件大小
List<FileItem> list=sfu.parseRequest(request); //泛型文件项目
//遍历集合
for(FileItem fileItem :list){
if(fileItem.isFormField()){ //判断是否普通表单
//普通表单解析 方法
processFromFileld(fileItem);
}else{
//上传表单解析方法 上传表单除了是文件的input 其他也会走普通表单方法
processUpload(fileItem);
}
}
}catch (FileUploadBase.FileSizeLimitExceededException e){
throw new RuntimeException("上传文件过大 ,充会员吧");
}catch (FileUploadBase.SizeLimitExceededException e){
throw new RuntimeException("上传总文件超过10M ,充会员吧");
}catch (FileUploadException e) {
e.printStackTrace();
}
}
//上传表单解析方法
private void processUpload(FileItem fileItem) {
//得到上传名称
String filename=fileItem.getName(); //得到文件项目的名字 1.jpg 不同浏览器访问的名称路径不同
//得到文件输入流
try {
InputStream is = fileItem.getInputStream();
//1.通过输出流将上传的文件携带服务器或指定位置(外网访问问题)
String directoryrealPath = this.getServletContext().getRealPath("WEB-INF/upload"); //保存到磁盘路径 --保存到了服务器中
//WEB-INF/upload 存到web-inf中外部浏览器不能访问
//创建一个存储目录
File storeDirectory = new File(directoryrealPath);
if(!storeDirectory.exists()){
storeDirectory.mkdirs(); //不存在创建一个目录
}
//2.解决浏览器获取文件路径的问题 //截取文件名 File.separator文件名分割符
//filename.substring(filename.lastIndexOf(File.separator)+1);
if(filename!=null){
filename=FilenameUtils.getName(filename); //io.FilenameUtils中封装了一个截取文件名的方法
}
//3.解决同名问题
filename=UUID.randomUUID()+"_"+filename;
//4.按照日期上传文件名
//String ChildDirectory = makChildDirectory(storeDirectory);//创建一个方法 ,添加日期目录
//优化打乱名称
String ChildDirectory = makChildDirectory(storeDirectory,filename);
//创建一个完整路径 //WEB-INF/upload/日期/1.jpg File.separator(文件分割符)
/*File file = new File(storeDirectory,ChildDirectory+File.separator+filename); //目录和文件名 /upload/1.jpg
//创建文件
FileOutputStream fos = new FileOutputStream(file);
int len=0;
byte by[]=new byte[1024];
while((len=is.read(by))!=-1){
fos.write(by,0,len);
}
fos.close();
is.close();*/
//简化上传代码
fileItem.write(new File(storeDirectory,ChildDirectory+File.separator+filename));
//上传结束 清楚临时文件
//fileItem.delete();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 优化打散名称
private String makChildDirectory(File storeDirectory, String filename) {
int hashcode = filename.hashCode(); //返回String转换成的32位的hashcode吗
String code = Integer.toHexString(hashcode);//转换成16进制的数
String childDirectory=code.charAt(0)+File.separator+code.charAt(1);//取第一个值 第二个值创建文件夹
File file=new File(storeDirectory,childDirectory); //WEB-INF/upload/?/?
if(!file.exists()){
file.mkdirs();
}
return childDirectory;
}
//按照日期处理同名文件问题 目录
private String makChildDirectory(File storeDirectory) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String datedirectory = sdf.format(new Date()); //new date 当前时间的毫秒值
//创建目录
File file=new File(storeDirectory,datedirectory); //WEB-INF/upload/2018...
if(!file.exists()){
file.mkdirs(); //mkdir单层目录 mkdirs多层目录
}
return datedirectory; //返回日期目录
}
//普通表单方法
private void processFromFileld(FileItem fileItem) {
//7.处理文件上传表单的乱码问题
try {
String filedname = fileItem.getFieldName(); //获取input name=""
String filedvalue = fileItem.getString(); //获取值
filedvalue=new String(filedvalue.getBytes("iso-8859-1"),"utf-8");
System.out.println(filedname+":"+filedvalue);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}