public class upLoadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判断上传的文件普通表单还是带文件的表单
if (!ServletFileUpload.isMultipartContent(req)) {
return;//终止方法运行,说明这是一个普通的表单,直接返回
}
String message = null;
try {
//创建上传文件的保存路径,建议在WEB-INF下,安全,用户无法直接访问上传的文件
String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
File uploadFile = new File(uploadPath);
//若地址不存在就创建
if (!uploadFile.exists()) {
uploadFile.mkdir();//创建这个目录
}
//使用缓存,当文件过大时,先存为临时文件
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
tempFile.mkdir();
}
//先创建DiskFileItemFactory对象;=======================================>>>
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//设置缓存区大小
diskFileItemFactory.setSizeThreshold(1024 * 1024);
//临时文件保存目录
diskFileItemFactory.setRepository(tempFile);
//获取ServletFileUpload对象============================================>>>
//作用是处理上传文件数据,将表单的每一项输入封装为Fileltem对象;
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//监听文件上传进度;
servletFileUpload.setProgressListener(new ProgressListener() {
@Override
public void update(long l, long l1, int i) {
DecimalFormat df = new DecimalFormat("0%");
System.out.println("文件总大小==》" + l1 + "已经上传 " + df.format( (((Long) l).intValue()/ ((Long) l1).doubleValue())));
}
});
//处理文件乱码
servletFileUpload.setHeaderEncoding("utf-8");
//设置单个文件最大值3M
servletFileUpload.setFileSizeMax(3 * 1024 * 1024);
//设置总大小
servletFileUpload.setSizeMax(100 * 1024 * 1024);
//处理上传的文件;============================================>>>
//前端请求解析; 封装为fileItem对象
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
for (FileItem fileItem : fileItems) {
//判断是输入框还是上传文件的;
//注意这个方法: 当返回 false 时才是文件类型的;
if (fileItem.isFormField()) {
//获取其他标签框的name;
String name = fileItem.getName();
//处理乱码问题;(统一编码)
String value = fileItem.getString("utf-8");
System.out.println(name + "<---->" + value);
} else {
// 获取文件名
String uploadName = fileItem.getName();
System.out.println("注意上传的文件名");
if (uploadName == null || uploadName.trim().equals("")) {
continue;
}
//输入文件的名字;与后缀名;
String realName = uploadName.substring(uploadName.lastIndexOf("/" )+ 1);
String nameSuffx = uploadName.substring(uploadName.lastIndexOf("." )+ 1);
System.out.println("实际文件名==>" + realName + "后缀文件类型=>" + nameSuffx);
String uploadFileId = UUID.randomUUID().toString();
//文件的存放地址问题============================================>>>
//文件真实地址加上uuid的通用码;
String realPath = uploadPath + "/" + uploadFileId;
File realFile = new File(realPath);
if (!realFile.exists()) {
//创建目录;
realFile.mkdir();
}
//文件传输==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>流的方式;
InputStream inputStream = fileItem.getInputStream();
FileOutputStream out = new FileOutputStream(realPath + "/" + realName);
//创建传输的缓冲区;
byte[] arr = new byte[1024];
int len = 0;
while ((len = inputStream.read(arr)) > 0) {
out.write(arr, 0, len);
}
out.close();
inputStream.close();
message = "上传成功";
}
}
} catch (FileUploadException e) {
message = "上传失败";
e.printStackTrace();
}
req.setAttribute("message", message);
req.getRequestDispatcher("result.jsp").forward(req, resp);
}
}