文件的上传是项目中常见的核心功能,比如在注册的时候可能在表单中要求用户提交照片等。此时就需要使用到文件的上传,本次课题以上传雇员的照片作为需求,但是在很多时候上传的的需求不仅仅是雇员,可能需要上传管理员头像等等,此时需要增加管理员的信息也可能要上传到servlet。文件上传的第三方工具有很多,我们这次使用的是SmartUpload组件。

  1.定义表单(login.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><base href="/MvcPro/"/><meta charset="UTF-8"><title>Insert title here</title><script type="text/javascript" src="js/jquery.min.js"></script>
</head>
<body><form action="emp/regist" method="POST" enctype="multipart/form-data"><fieldset><legend>请注册</legend>编号:<input type="text" value="74211" name="empno"/><br><br>名字:<input type="text" value="smith" name="ename"><br><br> 编号:<input type="text" value="7788" name="mgr"><br><br> 薪资:<input type="text" value="9000.00" name="sal"><br><br> 职位:<input type="text" value="Java" name="job"><br><br> 佣金:<input type="text" value="1000.00" name="comm"><br><br> 部门编号:<input type="text" value="10" name="deptno"><br><br> 日期:<input type="text" value="2019-10-10" name="hiredate"><br><br> 照&nbsp;&nbsp;&nbsp;片:<input type="file" name="img"><br><br><input type="submit" value="提交"><input type="reset" value="重置"></fieldset></form>
</body>
</html>

  2.定义公共类(BaseServlet.java)

  上传是一个公共的操作,可能在很多个servlet中都要涉及到上传,比如在EmpServlet中要上传雇员的照片,在ManageServlet中药上传管理员的照片,此时就需要将上传的操作定义到一个公共父类(可以定义为工具类)。由于上传信息里除了文件还需要提交其他信息,则表单数据提交需要转换成为二进制数据,需要在表单中添加enctype="multipart/form-data",此时可以实现文件的上传但是使用内置对象request获取表单的其他数据的时候就无法获取,此时直接借助SmarUplaod获取参数(需要导包)。

  

package com.sxt.mvcpro.controller;import java.io.File;
import java.lang.reflect.Field;
import java.sql.Date;
import java.text.SimpleDateFormat;
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;@SuppressWarnings("serial")
public abstract class BaseServlet extends HttpServlet {SmartUpload smart = null;String newFileName = null;public void saveFile(HttpServletRequest req, HttpServletResponse resp) {smart = new SmartUpload();ServletConfig config = super.getServletConfig();// 照片处理try {// 初始化
            smart.initialize(config, req, resp);smart.setAllowedFilesList("jpg,png,gif,jpeg");smart.setMaxFileSize(1024 * 1024 * 1024 * 5);smart.setTotalMaxFileSize(1024 * 1024 * 1024 * 5 * 10);smart.upload();// 取得上传文件的路径信息String filepath = req.getServletContext().getRealPath("/"+getDir());File file = new File(filepath);if (!file.exists()) {file.mkdirs();}// 按照文件的原名称保存// smart.save(filePath)if (smart.getFiles().getFile(0).getSize()>0) {String ext = smart.getFiles().getFile(0).getFileExt();// 生成新的文件名String fileName = UUID.randomUUID().toString().replaceAll("-", "");newFileName = this.getDir() + fileName + "." + ext;// 保存文件(按照新文件名保存)smart.getFiles().getFile(0).saveAs(filepath + fileName + "." + ext);} else {throw new Exception("文件为空");}} catch (Exception e) {e.printStackTrace();}}public <T> T initObj(HttpServletRequest req, Class<T> clz) {T t = null;try {t = clz.newInstance();Field[] fs = clz.getDeclaredFields();for (int i = 0; i < fs.length; i++) {fs[i].setAccessible(true);// 取得属性名String fname = fs[i].getName();// 从request内置对象中取得对应的值String fvalue = null;if (this.smart == null) {fvalue = req.getParameter(fname);} else {fvalue = this.smart.getRequest().getParameter(fname);}System.out.println(fvalue);if (fvalue == null) {continue;}if ("Double".equals(fs[i].getType().getSimpleName())) {System.out.println(fs[i].getType().getSimpleName());fs[i].set(t, Double.valueOf(fvalue));} else if ("Integer".equals(fs[i].getType().getSimpleName())) {fs[i].set(t, Integer.valueOf(fvalue));} else if ("Date".equals(fs[i].getType().getSimpleName())) {fs[i].set(t, new Date(new SimpleDateFormat("yyyy-MM-dd").parse(fvalue).getTime()));} else {fs[i].set(t, fvalue);}}} catch (Exception e) {e.printStackTrace();}return t;}//    增加一个抽象方法 子类必须实现(文件夹的名称交给子类决定)public abstract String getDir();
}

  3.修改控制层(EmpServlet.java)

  在实际的开发中实现文件的上传的同时肯定还有其他信息需要保存到数据库。

package com.sxt.mvcpro.controller;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sxt.mvcpro.factory.ServiceFactory;
import com.sxt.mvcpro.service.IEmpService;
import com.sxt.mvcpro.service.impl.EmpServiceImpl;
import com.sxt.mvcpro.vo.Emp;@WebServlet(urlPatterns= {"/emp/*","/dept/*"})
public class EmpServlet extends BaseServlet {//取得业务层实现类对象private IEmpService empservice=(IEmpService)ServiceFactory.getInstance(EmpServiceImpl.class);@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String pathInfo = req.getPathInfo();try {if ("/login".equals(pathInfo)) {this.login(req, resp);} else if ("/regist".equals(pathInfo)) {this.regist(req, resp);}} catch (Exception e) {e.printStackTrace();}}public void regist(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {req.setCharacterEncoding("UTF-8");//    super.saveFile(req,resp);//    将基本信息保存到数据库中super.saveFile(req, resp); Emp emp = super.initObj(req, Emp.class);emp.setImg(super.newFileName);try {if (empservice.addEmp(emp)) {//    保存添加的雇员的信息req.setAttribute("emp", emp);req.getRequestDispatcher("/pages/emp.jsp").forward(req, resp);}} catch (Exception e) {e.printStackTrace();}System.out.println(emp);}/***     负责登陆的方法* @param req* @param resp* @throws Exception*/public void login(HttpServletRequest req, HttpServletResponse resp) throws Exception {String random = req.getParameter("code");String username = req.getParameter("username");String pwd = req.getParameter("pwd");if (req.getSession().getAttribute("rand").equals(random)) {if ("smith".equals(username)&&"1234".equals(pwd)) {//    保存用户信息到session之后跳转到欢迎页面req.getSession().setAttribute("name", username);resp.sendRedirect("/MvcPro/pages/welcome.jsp");} else {//    告知用户名和密码不正确(跳转到登录页面)req.setAttribute("msg", "用户名密码有误");req.getRequestDispatcher("/pages/login.jsp").forward(req, resp);}} else {//    跳转到登录页面告诉用户验证码不正确req.setAttribute("msg", "验证码错误");req.getRequestDispatcher("/pages/login.jsp").forward(req, resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}@Overridepublic String getDir() {return "empImgs/";}}

  4.定义Emp类

package com.sxt.mvcpro.vo;import java.io.Serializable;
import java.sql.Date;public class Emp implements Serializable {private Integer empno;private String ename;private String job;private Double sal;private Date hiredate;private Integer mgr;private Double comm;private Integer deptno;private String img;public Emp() {super();}public Emp(Integer empno, String ename, String job, Double sal, Date hiredate, Integer mgr, Double comm,Integer deptno) {super();this.empno = empno;this.ename = ename;this.job = job;this.sal = sal;this.hiredate = hiredate;this.mgr = mgr;this.comm = comm;this.deptno = deptno;}public Integer getEmpno() {return empno;}public void setEmpno(Integer empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Double getSal() {return sal;}public void setSal(Double sal) {this.sal = sal;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public Integer getMgr() {return mgr;}public void setMgr(Integer mgr) {this.mgr = mgr;}public Double getComm() {return comm;}public void setComm(Double comm) {this.comm = comm;}public Integer getDeptno() {return deptno;}public void setDeptno(Integer deptno) {this.deptno = deptno;}public String getImg() {return img;}public void setImg(String img) {this.img = img;}@Overridepublic String toString() {return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", sal=" + sal + ", hiredate=" + hiredate+ ", mgr=" + mgr + ", comm=" + comm + ", deptno=" + deptno + ", img=" + img + "]";}public Emp(Integer empno, String ename, String job, Double sal, Date hiredate, Integer mgr, Double comm,Integer deptno, String img) {super();this.empno = empno;this.ename = ename;this.job = job;this.sal = sal;this.hiredate = hiredate;this.mgr = mgr;this.comm = comm;this.deptno = deptno;this.img = img;}}

  5.测试结果

转载于:https://www.cnblogs.com/wangdh666/p/10773571.html

10.基于Tomcat的SmartUplaod文件上传相关推荐

  1. [RFC1867] HTML中基于表单的文件上传

    网络工作组:E. Nebel 征求意见:1867 L. Masinter 类别:试验 施乐公司 十一月 1995 HTML中基于表单的文件上传 这个备忘录的状态 这个备忘录为互联网社区定义了一个试验协 ...

  2. SSM框架 基于Bootstrap fileinput 实现文件上传功能

    SSM框架 基于Bootstrap fileinput 实现文件上传功能 pom.xml文件的配置 想要实现SSM框架实现多文件上传,必要的jar包必须要在pom.xml文件中引入.如下: <! ...

  3. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

  4. Mr.张小白(案例:基于Spring MVC实现文件上传和下载)

    基于Spring MVC实现文件上传和下载 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&quo ...

  5. ajax实现上传文件的进度,基于Ajax技术实现文件上传带进度条

    1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运 ...

  6. Nodejs基于express+multer的文件上传

    概览 图片上传是web开发中经常用到的功能,node社区在这方面也有了相对完善的支持. 常用的开源组件有multer.formidable等,借助这两个开源组件,可以轻松搞定图片上传. 本文主要讲解以 ...

  7. 10个有用的HTML文件上传技巧

    上传文件的能力是许多Web和移动应用的关键需求,从将照片上传到社交媒体上到将简历发布到工作门户网站上,文件上传无处不在. 作为一名Web开发人员,我们一定知道HTML提供了原生文件上传的支持,并借助于 ...

  8. ajax文件插件上传,7 款基于 JavaScript/AJAX 的文件上传插件

    本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 具有多文件上传.拖 ...

  9. 简单的html网页图片上传,10个有用的HTML文件上传技巧

    上传文件的能力是许多Web和移动应用的关键需求,从将照片上传到社交媒体上到将简历发布到工作门户网站上,文件上传无处不在. 作为一名Web开发人员,我们一定知道HTML提供了原生文件上传的支持,并借助于 ...

最新文章

  1. django mysql 时区_django 中的时区设置
  2. 学python要下载什么-从应用的角度去学习Python--为孩子下载课本
  3. 利用rsync如何同步单个文件
  4. Connect to dl.google.com:443 [dl.google.com/142.250.66.142] failed: Connection timed out:
  5. C# 8 的新提案:new 关键字类型推断
  6. 结合 Mist 在本地测试网络上实现代币智能合约
  7. 高程3总结#第20章JSON
  8. 微信jssdk开发 java_Java微信公众平台开发(十一)--微信JSSDK中Config配置
  9. 计算机操作系统第4版期末复习
  10. Java项目:校园自行车租赁管理系统(java+JSP+JavaScript+Servlet+Mysql)
  11. Windows + CUDA + Anaconda + TensorFlow + PyCharm
  12. IntelliJ IDEA 下载安装以及破解码大集合
  13. java开发工程师必看书籍
  14. whose UTF8 encoding is longer than the max length 32766
  15. 2013,让你正能量无限的话
  16. 史上最全的用Python操控手机APP攻略!建议收藏!
  17. redis分布式锁实践 并实现看门狗锁续期机制
  18. 我的职业观——HP大中华区总裁孙振耀退休感言
  19. (复健计划)python中的字典
  20. Java:方法的使用

热门文章

  1. textarea怎么占满整个td_怎么知道网上的视频是不是专业摆拍?关注这些细节就可以了...
  2. php怎样加密文件,如何使用php加密大文件并通过命令行解密?
  3. ros在arm linux上移植,ROS在Zedboard上的移植
  4. 三线压力传感器原理_进气压力传感器原理与检修
  5. vue中监听input框获取焦点,失去焦点的问题
  6. mysql:mysql error:Access denied for user 'root'@'localhost' (using password: YES)
  7. 【原理+实战+视频+源码】java更新无法下载所需安装文件
  8. 【编译原理】关于克林闭包与正闭包的讨论
  9. python【力扣LeetCode算法题库】257- 二叉树的所有路径
  10. First update-【计算机方面的权威外文数据库(全)】