jsp中文件上传的实现
表单设置:<input type="file">
需注意的是:
服务器获取请求参数不能向普通表单项那样通过request.getParameter(“name”)方式获取,而是需要通过fileUpload.parseRequest(req)获取,该方法返回值是list,需进行遍历,对每一项进行判断是普通表单项还是上传文件表单项。当是普通项通过map.put(fileItem.getFieldName(),fileItem.getString())提交给服务器,若是上传文件表单项需先通过 fileItem.write(file),再调用map.put(“pic”,pathname)方法。
关于fileUpload的详细介绍通过commons-fileupload包查看深层源代码。
fileUpload的使用需导包:servletUpload
-
在项目WEB-INF中lib中添加
-
在编译器中添加
具体实现代码如下:
private Map<String, String> getParameterMap(HttpServletRequest req) {
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
FileUpload fileUpload = new FileUpload(diskFileItemFactory);
Map<String,String> map = new HashMap<>();
try {
List<FileItem> list = fileUpload.parseRequest(req);
for (FileItem fileItem : list) {
if (fileItem.isFormField()){//判断是否是普通表单项
map.put(fileItem.getFieldName(),fileItem.getString());
}else{//是 文件上传的表单项, 处理 上传文件,将 上传文件 保存到服务器的硬盘中
String path = this.getServletContext().getRealPath("/")+"upload"+ File.separator;
String fileName = UUID.randomUUID().toString();//避免同名覆盖
String suffix = fileItem.getName().substring(fileItem.getName().lastIndexOf('.'));
//TODO 验证大小,类型 等
System.out.println(path+fileName+suffix);
File file = new File(path+fileName+suffix);
fileItem.write(file);
//将路径 存储到 map,以便再存到数据库里
map.put("pic","/upload/"+fileName+suffix);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
在StudentServlet的post请求中add方法:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("a");
resp.setContentType("text/html;chartset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
switch (action){
case "add":
//添加文件上传后,编码格式发生了变化,不能用getParamerter获取参数
/* String name = req.getParameter("name");
int age = Integer.parseInt(req.getParameter("age"));
int gender = Integer.parseInt(req.getParameter("gender"));
String tel = req.getParameter("tel");
int class_id = Integer.parseInt(req.getParameter("class_id"));
Student student = new Student(name,age,gender,tel,class_id);*/
Map<String, String> map = getParameterMap(req);
Student student = new Student(map.get("name"),new Integer(map.get("age")),new Integer(map.get("gender")),map.get("tel"),new Integer(map.get("class_id")),map.get("pic"));
//调用业务层
boolean flag = ssi.add(student);
if(flag){
String path = req.getRequestURI()+"?a=look";
resp.sendRedirect(path);
}else{
resp.getWriter().print("<script>alert('error');history.back();</script>");
}
break;
在添加文件上传后form表单编码发生变化,需在.jsp文件表单标签中设置enctype=“multipart/form-data”:
<form class="form-horizontal col-md-12" id="fm" action="<%=contextPath%>/stu?a=add" method="post" enctype="multipart/form-data">
文件上传表单类型设置为file:
<input type="file" name="pic" class="form-control" id="pic" placeholder="照片">
附原理图如下: