package com.heima.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.heima.domin.Page;
import com.heima.service.upLoadService;
import com.heima.utils.UUIDUtils;
import com.heima.utils.UploadUtils;
public class uploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//判断是否是上表单
if(!ServletFileUpload.isMultipartContent(request)){
request.setAttribute("msg", "表单错误,请重新上传");
request.getRequestDispatcher("/view/file.jsp").forward(request, response);
}
//判断是上传表单。
//创建磁盘文件项工厂。
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//设置缓冲区大小
diskFileItemFactory.setSizeThreshold(5 * 1024 * 1024);
//获得临时缓冲区绝对磁盘路径。
String temp = getServletContext().getRealPath("/temp");
//当文件超过我指定大小时,文件的存放位置。
diskFileItemFactory.setRepository(new File(temp));
//获得文件的核心解析类。
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
//设置字符串编码,防止乱码。
fileUpload.setHeaderEncoding("UTF-8");
//设置上传的最大值。
//fileUpload.setFileSizeMax(5 * 1024 * 1024);
//解析request
//创建业务层对象。
upLoadService us = new upLoadService();
//创建page对象
Page page = new Page();
try{
List<FileItem> list = fileUpload.parseRequest(request);
//判断是否为上传文本项。
for (FileItem fileItem : list) {
//判断是普通项
if(fileItem.isFormField()){
//获得普通项的名称。
String name = fileItem.getFieldName();
//获得普通项的值。
String value = fileItem.getString("UTF-8");
if("pagename".equals(name)){
page.setPageName(value);
}else if("author".equals(name)){
page.setAuthor(value);
}else if("nation".equals(name)){
page.setNational(value);
}else if("project".equals(name)){
page.setProject(value);
}else if("university".equals("name")){
page.setUniversity(value);
}
}else{
//否则即为上传项
//获得项目名。
String filename = fileItem.getName();
//获得绝对磁盘路径
String filepath = getServletContext().getRealPath("/load");
//判断是否为ie6等版本低的浏览器。查找项目名中是否有\,需要将其转义为\\.
if(filename.indexOf("\\")!=-1){
//获得最后一个/的索引
int index = filename.lastIndexOf("\\");
//截取用户名。
filename = filename.substring(index+1);
}
//使用UUID处理用户名防止用户名重复而导致的覆盖。
String RealName = UUIDUtils.getUUIDFileName(filename);
//使用目录分级工具将上传目录分级
String upath = UploadUtils.getPath(RealName);
//获得上传路径
String path = filepath+upath;
//创建路径对象。
File file2 = new File(path);
//如果文件夹不存在。则创建多级目录
if(!file2.exists()){
file2.mkdirs();
}
page.setPageUri(path);
//传入service中。
us.service(page);
//获得文件内容。
InputStream is = fileItem.getInputStream();
//获得输出流。
OutputStream os = new FileOutputStream(page+"\\"+RealName);
int len = 0;
byte[] arr = new byte[1024];
while((len=is.read(arr))!=-1){
os.write(arr, 0, len);
}
//关流
is.close();
os.close();
}
//删除临时文件
fileItem.delete();
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
这时后台