文件上传
文件的上传也是项目中常见的功能,算是项目的一个核心功能,比如在注册的时候,很可能需要在表单中要求用户提交照片,此时就需要用到文件的上传
文件上传的第三方工具有很多,这次我们先用SmartUpload组件
下载之后将工具包拷贝到项目的 lib 下
定义表单
regist.jsp
<%@ 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>
<form action="emp/add" method="post" enctype="multipart/form-data">
<fieldset>
<legend>请注册</legend>
名字: <input type="text" name="username" placehodler="输入用户名"><br>
<br> 薪资:<input type="text" name="sal"
placehodler="薪资"><br>
<br> 职位:<input type="text" name="job"
placehodler="佣金"><br>
<br> 佣金:<input type="text" name="comm"
placehodler=""><br>
<br> 部门编号:<input type="text" name="deptno"
placehodler=""><br>
<br> 照 片:<input type="file" name="pic"><br>
<br> <input type="submit" value="提交"> <input
type="reset" value="重置">
</fieldset>
</form>
</body>
</html>
定义一个公共类
上传是一个公共类的操作,可能在很多个servlet中都要涉及到上传,此时就需要将上传的操作定义到一个公共父类
package com.xie;
import java.io.File;
import java.util.UUID;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jspsmart.upload.SmartUpload;
public abstract class BaseServlet extends HttpServlet{
/**
* 保存文件
* @param req
* @param resp
*/
public void saveFile(HttpServletRequest req, HttpServletResponse resp) {
//照片处理
try {
//1.实例化上传的工具类对象
SmartUpload smart = new SmartUpload();
//2.取得config内置对象
ServletConfig config = this.getServletConfig();
//3.初始化
smart.initialize(config, req, resp);
//4.设置相关参数(允许上传的文件类型)
smart.setAllowedFilesList("jpg,png");
//smart.setDeniedFilesList("pdf"); 不允许的文件类型
//4.1.设置单个文件的最大值
smart.setMaxFileSize(1024*1024*10);
//4.2.设置所有文件的最大值
smart.setTotalMaxFileSize(1024*1024*10*10);
//5.实现上传(将文件放到内存,还没有保存到磁盘)
smart.upload();
//6.取得项目的部署路径
String savePath = req.getServletContext().getRealPath("/img/");
System.out.println(savePath);
File file = new File(savePath);
if (!file.exists()) {
file.mkdirs();
}
//7.按照文件的原名称保存
//smart.save(savePath);
//8.为文件重命名保存(避免覆盖)
//取得文件的拓展名
String ext = smart.getFiles().getFile(0).getFileExt();
//生成新的文件名
String newFileName = UUID.randomUUID() + "." + ext;
//按照新的文件名保存文件,取得的是第一张照片对象直接调用该对象的saveAs方法实现保存
smart.getFiles().getFile(0).saveAs(savePath + newFileName);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除文件
* @param req
* @param fileName 要删除的文件名
*/
public void removeFile(HttpServletRequest req, String fileName) {
String removePath = req.getServletContext().getRealPath("/img"+this.getDir()+fileName);
File file = new File(removePath);
if (file.exists()) {//如果存在则删除
file.delete();
}
}
/**
* 根据子类取得上传的文件夹名
* @return
*/
public abstract String getDir();
}
package com.xie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
@WebServlet(urlPatterns= {"/emp/*"})
public class EmpServlet extends BaseServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String pathInfo = req.getPathInfo();
if ("/add".equals(pathInfo)) {
this.addEmp(req, resp);
}else if ("/remove".equals(pathInfo)) {
this.removeEmp(req, resp);
}
}
/**
* 添加雇员信息
* @param req
* @param resp
*/
public void addEmp(HttpServletRequest req, HttpServletResponse resp) {
String name = req.getParameter("username");
//String sal = req.getParameter("sal");
//String comm = req.getParameter("comm");
String job = req.getParameter("job");
//将字符串类型的编号转换为整数类型
System.out.println(req.getParameter("deptno"));
System.out.println("名字:" + name + ",职位:" + job);
//将以上信息保存到数据库
//上传照片
super.saveFile(req, resp);
}
/**
* 删除雇员信息
* @param req
* @param resp
*/
public void removeEmp(HttpServletRequest req, HttpServletResponse resp) {
super.removeFile(req, "");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
public String getDir() {
return "/emp/";
}
}