文件上传-javaweb
需要导入的jar包有:commons-fileupload-1.3.3.jar
commons-io-2.6.jar
eclipse 导入jar包的看最下面
防止Commons IO导包错了,列举一下。
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
servlet
节约篇幅,导包就不显示出来,alt+ / 导包(eclipse) alt+anter(idea)
package com.xhb.controller;
@WebServlet("/Zy3_UserServlet")
public class Zy3_UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public Zy3_UserServlet() {
super();
}
public void register(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Map<String, String> paramList = FileUploadUtil.getParamList();// 普通表单的参数
List<FileItem> fileList = FileUploadUtil.getFileList(); // 文件表单中的文件
// 校验数据
checkParams(req,resp,paramList,fileList);
// 保存头像
// 文件上传到本地,返回文件的UUID
File realPathFile = new File(req.getServletContext().getRealPath("/upload")+"/"+paramList.get("name"));
if (!realPathFile.exists()) {
realPathFile.mkdir();
}
List<String> fileUUIDList = FileUploadUtil.fileUploadToLocal(req.getServletContext().getRealPath("/upload")+"/"+paramList.get("name"));
HttpSession session = req.getSession();
User user = new User();
user.setName(paramList.get("name"));
user.setPassword(paramList.get("password"));
user.setTxUUID(fileUUIDList.get(0));
session.setAttribute("user", user);
resp.sendRedirect("zy3_show.jsp");
}
// 获取头像
public void tx(HttpServletRequest request,HttpServletResponse response) throws IOException, Exception {
System.out.println("tx");
User user = (User)request.getSession().getAttribute("user");
System.out.println(user);
String uploadPath = req.getServletContext().getRealPath("/upload");
File tx = new File(uploadPath+"\\"+user.getName()+"\\"+user.getTxUUID());
System.out.println("tx:"+tx);
response.setContentType("image/jpeg"); // 响应的类型是图片
BufferedImage image = ImageIO.read(tx);// 从本地中读取图片
OutputStream os = response.getOutputStream();
ImageIO.write(image, "png",os ); // 响应给客户端
os.flush();
os.close();
}
// 校验前端数据 (不符后规范,转发到页面 提示用户)
public void checkParams(HttpServletRequest req, HttpServletResponse resp,Map<String, String> paramList,List<FileItem> fileList ) throws Exception {
boolean flag = true;
String name = paramList.get("name");
String password = paramList.get("pwd");
req.setAttribute("name", name);
req.setAttribute("password", password);
// 验证用户名
if(name.length()<6 || name.length()>18 ) {
req.setAttribute("nameErr", "纯英文字符,长度在6-18之间");
flag = false;
}else {req.setAttribute("nameErr", "ok");}
for(int i=0;i<name.length();i++) {
if(!((name.charAt(i)>='A' && name.charAt(i)<='Z') || (name.charAt(i)>='a' && name.charAt(i)<='z'))) {
req.setAttribute("nameErr", "纯英文字符,长度在6-18之间");
flag = false;
break;
}
}
// 验证密码
if(password.length()<6 || isNumeric(password)) {
req.setAttribute("pwdErr", "长度必须大于6,不能是纯数字");
flag = false;
}else {req.setAttribute("pwdErr", "ok");}
// 验证头像
req.removeAttribute("txErr");
for (FileItem fileItem : fileList) {
//利用File对象方便的得到文件名
String fileName=new File(fileItem.getName()).getName();
//判断文件类型
String fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);//得到后缀
System.out.println(fileExtName+"后缀");
//jpg、png、<1M
if(!( ("jpg".equals(fileExtName)) || ("png".equals(fileExtName)) || (fileItem.getSize()<=1024*1024*1) ) ) {
req.setAttribute("txErr", "格式为png和jpg,大小不能超过1M");
flag = false;
}
}
if(!flag) { // 如果数据有问题,转发
req.getRequestDispatcher("zy3_register.jsp").forward(req, resp);
}
}
// 是否是纯数字
public boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if( !isNum.matches() ){
return false;
}
return true;
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 判断是否是文件
boolean isMultipart=ServletFileUpload.isMultipartContent(req);
try {
if(isMultipart) { // 是文件
req.setCharacterEncoding("utf-8");
DiskFileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload fileUpload=new ServletFileUpload(factory);
FileUploadUtil.parseFile(fileUpload.parseRequest(req));
Map<String, String> paramList = FileUploadUtil.getParamList();
if("register".equals(paramList.get("op"))) {
register(req, resp);
}else if("tx".equals(paramList.get("op"))) {
tx(req, resp);
}
}else { // 非文件
if("register".equals(req.getParameter("op"))) {
register(req, resp);
}else if("tx".equals(req.getParameter("op"))) {
tx(req, resp);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
工具类
手动封装
package com.xhb.utils;
public class FileUploadUtil {
private static List<FileItem> fileList = null; //文件集合列
private static Map<String, String> paramList = null; //普通表单参数列
/**
* 文件解析 (解析成普通表单参数 与 文件) 对应两个集合
* @param fileItemList
* @throws Exception
*/
public static void parseFile(List<FileItem> fileItemList) throws Exception {
fileList = new ArrayList<FileItem>();
paramList = new HashMap<String, String>();
for(FileItem item : fileItemList) {
//判断该项是否为普通项
if(item.isFormField()) {
String inputName = item.getFieldName();
String inputValue = item.getString("utf-8");
System.out.println("表单中input项的名字(name):"+inputName);
System.out.println("其值是:"+inputValue);
paramList.put(inputName, inputValue);
}else {
// 是文件项
System.out.println("该file项的名字(name):"+item.getFieldName());
System.out.println("文件名:"+item.getName());
fileList.add(item);
}
}
}
// 文件上传到本地 上传之后返回UUID的集合,方便后面存储或者使用
public static List<String> fileUploadToLocal(String localPaht) throws Exception {
List<String> fileUUIDList = new ArrayList<String>();
String fileName;// 文件名
File saveFile;// 定义要保存的文件(路径+文件名)
for (FileItem fileItem : fileList) {
fileName = new File(fileItem.getName()).getName(); //文件名 防止浏览器的不兼容
String uuid = UUID.randomUUID().toString();
fileName =uuid+ fileName.substring(fileName.lastIndexOf(".")); // 生成唯一文件名标识
System.out.println("fileName:"+fileName);
saveFile = new File(localPaht,fileName); // 要保存的文件(路径+文件名)
System.out.println("saveFile:"+saveFile);
fileItem.write(saveFile);
fileUUIDList.add(fileName);
}
return fileUUIDList; // 返回唯一标识文件名的 list,便于后面操作
}
// 获取表单文件s
public static List<FileItem> getFileList() {
return fileList;
}
// 获取表单普通参数
public static Map<String, String> getParamList() {
return paramList;
}
}
前端
注册界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
span{
color:red;
}
</style>
<!-- 引入 layui.css -->
<link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css">
<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.6.8/dist/layui.js"></script>
<!-- jquery -->
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<!--重点 enctype="multipart/form-data" method="post" 文件表单必备-->
<form class="layui-form" action="Zy3_UserServlet" enctype="multipart/form-data" method="post">
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-inline">
<input type="text" name="name" value="${name }" required lay-verify="required" placeholder="请输入姓名" autocomplete="off" class="layui-input">
<span id="s_name">${nameErr }</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-inline">
<input type="password" name="pwd" value="${password }" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
<span id="s_pwd">${pwdErr } </span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">头像:</label>
<div class="layui-input-inline">
<input type="file" name="tx">
<span id="s_tx">${txErr }</span>
</div>
</div>
<input type="hidden" name="op" value="register">
<input type="submit" value="注册">
</form>
</body>
</html>
显示界面
注册后,显示用户名,头像
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功 <br>
${user.name }
<img alt="tx" src="Zy3_UserServlet?op=tx" style="width: 50px;height: 50px; border-radius: 25px;">
</body>
</html>
eclipse 导包
工程导入jar包
右击项目 --> properties
web项目发布导入jar包
记得apply 一下。