@MultipartConfig注解方式上传文件(Tomcat8 和 servlet 3.0)
JavaWeb中上传文件可以说是比较麻烦的,在servlet3.0之前,上传文件通常借助一些jar包来完成,其中相关的API较多,写起来非常不便.在servlet3.0以后,改进了部分的API,可以通过@multipartConfig注解以及相关的方法比较方便的进行文件上交.
详细讲解连接:https://blog.csdn.net/mytt_10566/article/details/71077154
protected void updateUser(HttpServletRequest req, HttpServletResponse resp) {
try {
//1.获得请求数据
//1.1 获得请求的map
Map<String, String[]> map = req.getParameterMap();
//1.2 创建即将被封装的user
User user = new User();
//1.3 封装数据
BeanUtils.populate(user, map);
// -------------------------------------------------------------------文件上传
// 图片对象
Part pic = req.getPart("pic");
if (pic != null && pic.getSize() != 0) {//一定有文件上传了
//1.获得文件的名称
// 使用tomcat 8以及servlet3.0时使用下面方法获取文件名称
String fileName = pic.getSubmittedFileName(); //文件名称
//2.获得文件即将保存位置
//获得web项目在本地发布的后路径
String realPath = getServletContext().getRealPath("/img");
System.out.println(fileName);
//3.拿到文件的流
InputStream is = pic.getInputStream();
//4.输出文件
FileOutputStream os = new FileOutputStream(realPath + "/" + fileName);
IOUtils.copy(is, os);
//5.释放资源
is.close();
os.close();
//赋值的路径
//user.setPic(realPath + "/" + fileName)
//使用相对路径
user.setPic("img/" + fileName);
}
//-------------------------------------------------------------------文件上传
//2.处理数据
UserService userService = new UserServiceImpl();
//修改用户信息
userService.updateUser(user);
//数据库和缓存session数据不同步 需要再次查询数据 放入session替换
User loginUser = (User) req.getSession().getAttribute("user");
//再次查询 替换数据
loginUser = userService.findByTelephone(loginUser.getTelephone());
//替换session用户数据
req.getSession().setAttribute("user", loginUser);
//3.响应结果
resp.sendRedirect(req.getContextPath() + "/home_index.jsp");
} catch (Exception e) {
e.printStackTrace()
}
}
@MultipartConfig注解方式上传文件(Tomcat 7)
在tomcat7 的环境下就没有part.getSubmittedFileName()这一方法,无法直接获取文件名
解决方案:
将上面代码的 String fileName = pic.getSubmittedFileName(); 使用以下代码替换即可解决问题.
String cd = part.getHeader("Content-Disposition");
//截取不同类型的文件需要自行判断
String filename = cd.substring(cd.lastIndexOf("=")+2, cd.length()-1);