10.基于Tomcat的SmartUplaod文件上传

  文件的上传是项目中常见的核心功能,比如在注册的时候可能在表单中要求用户提交照片等。此时就需要使用到文件的上传,本次课题以上传雇员的照片作为需求,但是在很多时候上传的的需求不仅仅是雇员,可能需要上传管理员头像等等,此时需要增加管理员的信息也可能要上传到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);

    @Override
    protected 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);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }

    @Override
    public 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;
    }

    @Override
    public 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

时间: 2024-10-12 21:08:20

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

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 1 <%@ page language="jav

Struts2文件上传(基于表单的文件上传)

•Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目 •Commons-FileUpload组件特点 –使用简单:可以方便地嵌入到JSP文件中,编写少量代码即可完成文件的上传功能 –能够全程控制上传内容 –能够对上传文件的大小.类型进行控制 •需要下载Common-FileUplaod框架地址(当然MyEclipce中Struts2支持里自带有这两个包): –http://jak

Servlet3.0学习总结——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 <%@ page language="java&

用c++开发基于tcp协议的文件上传功能

用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学阅读,比 APUE 讲的更深入 这是某个银行广告项目(p2p传输视频)的一部分 IO模型采用的阻塞模式,文件一打开就直接上传 用vc 2003编译,生成win32 dll 麻雀虽小五脏俱全,CSimpleSocket,CReadStream dll 输出一虚类 extern "C" __d

基于asp.net 的文件上传和下载~~~转

基于asp.net 的文件上传和下载 摘要: 文件的上传和下载是网络中非常重要的两种应用, 本文介绍了使用asp.net 控件实现文件上传的基本方法.解决了当上传大文件时出现各种问题, 并给出了几种解决方案和技巧.另外, 下载文件用二进制读写的方式实现. 1 引言          文件的上传和下载是网络中非常重要的两种应用.其实现方法主要有FTP 方式和HTTP 方式两种, FTP( File Transfer Protocol)是指文件传输协议, 主要用来在网络上传输文件.这种方式虽说文件传

基于Servlet+smartUpload的文件上传

文件上传在web应用中是非常常见的,现在我就介绍下基于servlet的文件上传,基于Struts2的文件上传可以看: 页面端代码: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <ht

基于Nodejs的大文件上传之断点续传

接着<扒一扒Nodejs formidable的onPart>和<也说文件上传之兼容IE789的进度条---丢掉flash>:前面已完成兼容IE789的大文件上传:无flash的低版本进度条,高版本的分段上传,并已为断点续传做好铺垫: 说什么做好铺垫,原本以为Nodejs端已没问题,只剩前端依靠HTML5接着监听abort事件,保存中断时上传到第几块了(断点续传只支持文件比较大,然后意外上传中断了,暂时定50M开启断点续传吧),通过文件内容hash和该文件唯一上传token来记录断

【转】NodeJS教程--基于ExpressJS框架的文件上传

本文是翻译的一篇文章,原文地址:Handle File Uploads in Express (Node.js). 在NodeJS发展早期上传文件是一个较难操作的功能,随后出现了formidable.它开了一个好头,然而上传文件仍然不是那么容易.在此之后又出现了基于原文作者的教程(tutorial on handling POST requests in Express)而实现的工具connect-form.它让文件上传的过程显得简单了一些. 随着NodeJS社区的飞速发展,让上传文件这个功能变

基于jquery的多文件上传

1.文件上传前台设计 说到前台设计,还真的有些不知道怎么讲好,还是老样子,直接上图来的直接,在此也说明下:本人不擅长做PS,所以很多素材(图片)都是网上寻找的,这个上传程序可以上传各种文件,至于哪些?我没数过,我不介意你数一数,我就用简单的图片上传来演示吧,附带预览功能. 还没有上传的时候的界面(有点丑,莫嫌弃) 要开始上传时: 这个时候鼠标上移的时候,可以对文件进行操作(删除掉误选的照片和查看文件名) 上传时的图片(由于本人是用js模拟上传,所以上面的总的进度条不会动,完整的程序完全没有问题)