使用Map封装请求信息并显示
upload.jsp表单文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>文件上传</h3><br/>
<span style="color:red;">${errorMsg}</span>
<form action="/upload-download-i18n/upload" method="POST" enctype="multipart/form-data">
账号:<input type="text" name="username"/><br/>
邮箱:<input type="text" name="email"/><br/>
头像:<input type="file" name="headImg" accept="image/*"/><br/>
<input type="submit" value="朕要提交"/><br/>
</form>
</body>
</html>
自定义异常类(LogicException):
public class LogicException extends RuntimeException{
private static final long serialVersionUID = 1L;
public LogicException(String message, Throwable cause) {
super(message, cause);
}
public LogicException(String message) {
super(message);
}
}
一、新建一个对象类(如:user)
@Data
public class User {
private String username = null;
private String email = null;
private String imageUrl = null;//图片保存的路径 (JSP:<img src="${user.imageUrl}">)
private String imageName = null;//图片的原始名称
}
二、在调用者类(UplocalServlet.java)中获得upload.jsp传入的参数值,并赋值给user对象,再在user.jsp中显示;
@WebServlet("/upload")
public class UploadServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
User user = new User();
//-------------------往user对象中传入数据-------------------------
//封装普通表单的数据
//key:参数名称
//value:参数值
Map<String,String> fieldMap = new HashMap<>();
//封装上传图片(因为要通过一个key获得两个value,所以对图片进行再封装)
//key:参数名称
//value:ImgFile对象同时封装了imgeUrl和imageName
Map<String,ImgFile> imgMap = new HashMap<>();
FileUtil.upload(req,fieldMap,imgMap);
user.setUsername(fieldMap.get("username"));
user.setEmail(fieldMap.get("email"));
user.setImageName(imgMap.get("headImg").getImageName());
user.setImageUrl(imgMap.get("headImg").getImageUrl());
//---------------------------------------------------------------
System.out.println(user);
System.out.println(fieldMap);
System.out.println(imgMap);
req.setAttribute("user", user);
req.getRequestDispatcher("/user.jsp").forward(req, resp);
}catch(LogicException e) {
String errorMsg = e.getMessage();//获取异常信息
req.setAttribute("errorMsg",errorMsg);
req.getRequestDispatcher("/upload.jsp").forward(req, resp);
}
}
}
三、封装的ImgFile类(保存图片相对路径和真实名称)
@Data
public class ImgFile {
private String imageUrl = null;//图片保存的路径 (JSP:<img src="${user.imageUrl}">)
private String imageName = null;//图片的原始名称
}
四、使用自定义的工具类(FileUtil.java)进行接受处理upload.jsp传入的参数
public class FileUtil {
//允许接受上传的文件类型(如:图片)
private static final String ALLOWED_IMAGE_TYPE="png;gif;jpg;jpeg";
public static void upload(HttpServletRequest req,Map<String,String> fieldMap,Map<String,ImgFile> imgMap){
//解析和检查请求:请求方式是否是POST,请求编码是否是muitipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if(!isMultipart) {
return;
}
try {
//1.创建FileItemFactory对象
//FileItemFactory是用来创建FileItem对象的
//FileItem对象:form表单中的表单控件的封装
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.创建文件上传处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置单个上传文件的大小限制
upload.setFileSizeMax(1024*1024*2);//2M
//设置该次请求总数据大小限制
upload.setSizeMax(1024*1024*3);//3M
//3.解析请求
List<FileItem> items = upload.parseRequest(req);
//4.迭代出每一个FileItem
for(FileItem item : items) {
String fieldName = item.getFieldName();//获取表单控件的name属性值(参数名)
if(item.isFormField()) {
//普通表单控件
//得到控件的参数值
String value = item.getString("UTF-8");
//存储控件名称(jsp文件中的name)和对应的value值,最后返回到调用者中进行读取
fieldMap.put(fieldName,value);
}else {
//-----------------------判断上传文件格式是否符合要求------------
//上传文件的拓展名
String ext = FilenameUtils.getExtension(item.getName());
String[] allowedImageType = ALLOWED_IMAGE_TYPE.split(";");
//当前上传类型不再允许的范围内
if(!Arrays.asList(allowedImageType).contains(ext)) {
throw new LogicException("上传格式错误,请重新上传");
}
//----------------------------------------------------------
//表单上传控件
System.out.println("上传文件的名称:"+item.getName());
//文件名称
String fileName = UUID.randomUUID().toString()+"."
+FilenameUtils.getExtension(item.getName());
//目标的绝对路径"E:/JAVA/My_eclipseEE/upload-download-i18n/webapp/upload"
String dir = req.getServletContext().getRealPath("/upload");
//把二进制数据写到哪一个文件中
item.write(new File(dir, fileName));
//-----------将图片中的真实名字和图片相对路径保存在imgMap中,最后返回给调用者-------------------------
ImgFile img = new ImgFile();
img.setImageUrl("/upload/"+fileName);
img.setImageName(FilenameUtils.getName(item.getName()));
imgMap.put(fieldName,img);
//---------------------------------------------------
}
}
}catch(FileSizeLimitExceededException e) {
throw new LogicException("单个上传文件大小不能超过2M",e);//继续抛出异常类给该类调用者(UploadServlet)
}catch(SizeLimitExceededException e) {
throw new LogicException("该次请求大小不能超过3M",e);//继续抛出异常类给该类调用者(UploadServlet)
}catch(LogicException e) {
throw e;//继续抛出异常类给该类调用者(UploadServlet)
}catch(Exception e) {
e.printStackTrace();
}
}
}
五、在user.jsp中显示表单输入的内容
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${user}<br/>
名称:${user.username}<br/>
邮箱:${user.email}<br/>
头像:${user.imageName}<br/>
<img alt="" src="${user.imageUrl}"><br/>
</body>
</html>
upload.jsp:
user.jsp: