JSP+Servlet实现文件上传到服务器功能

本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下

项目目录结构大致如下:

正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC 架构,Dao是模型实体类(逻辑层),service是服务层,servlet是视图层,三者协作共同完成项目。

这里的User是由user表来定义的一个类,再封装增删改查等操作,实现从数据库查询与插入,修改与删除等操作,并实现了分页操作,也实现了将图片放到服务器上运行的效果。

Dao层:主要实现了User类的定义,接口IUserDao的定义与实现(UserDaoImpl);

service层:直接定义一个接口类IUserService,与IUserDao相似,再实现其接口类UserServiceImpl,直接实例化UserDaoImpl再调用其方法来实现自己的方法,重用了代码。详见代码吧;

servlet层:起初是将表User 的每个操作方法都定义成一个servlet 去实现,虽然简单,但是太多了,不好管理,于是利用 基类BaseServlet 实现了“反射机制”,通过获取的 action 参数自己智能地调用对应的方法,而UserServlet则具体实现自己的方法,以供调用,方便许多,详见之前的博文或下述代码。

将文件上传到 tomcat 服务器的编译后运行的过程的某个文件关键要在每次编译后手动为其创建该文件夹来存放相应的上传文件,否则会导致每次重启 tomcat 服务器后该编译后的工程覆盖了原先的,导致上传文件存放的文件夹不存在,导致代码找不到该文件夹而报错,即上传不成功。如下图所示:

主要是考虑图片路径的问题,手工设置路径肯定不能保证不重复,所以取到上传图片的后缀名后利用随机生成的随机数作为图片名,这样就不会重复名字了:

String extendedName = picturePath.substring(picturePath.lastIndexOf("."),// 截取从最后一个'.'到字符串结束的子串。
  picturePath.length());
  // 把文件名称重命名为全球唯一的文件名
  String uniqueName = UUID.randomUUID().toString();
  saveFileName = uniqueName + extendedName;// 拼接路径名

增加用户时代码如下:

 // 增
 public void add(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 System.out.println("add方法被调用");
 // 获取数据
 int id = 0;
 String username = null;
 String password = null;
 String sex = null;
 Date birthday = null;
 String address = null;
 String saveFileName = null;
 String picturePath = null;
 // 得到表单是否以enctype="multipart/form-data"方式提交
 boolean isMulti = ServletFileUpload.isMultipartContent(request);
 if (isMulti) {
  // 通过FileItemFactory得到文件上传的对象
  FileItemFactory fif = new DiskFileItemFactory();
  ServletFileUpload upload = new ServletFileUpload(fif);

  try {
  List<FileItem> items = upload.parseRequest(request);
  for (FileItem item : items) {
   // 判断是否是普通表单控件,或者是文件上传表单控件
   boolean isForm = item.isFormField();
   if (isForm) {// 是普通表单控件
   String name = item.getFieldName();
   if ("id".equals(name)) {
    id = Integer.parseInt(item.getString("utf-8"));
    System.out.println(id);
   }
   if ("sex".equals(name)) {
    sex = item.getString("utf-8");
    System.out.println(sex);
   }
   if ("username".equals(name)) {
    username = item.getString("utf-8");
    System.out.println(username);
   }
   if ("password".equals(name)) {
    password = item.getString("utf-8");
    System.out.println(password);
   }
   if ("birthday".equals(name)) {
    String birthdayStr = item.getString("utf-8");
    SimpleDateFormat sdf = new SimpleDateFormat(
     "yyyy-MM-dd");
    try {
    birthday = sdf.parse(birthdayStr);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    System.out.println(birthday);
   }
   if ("address".equals(name)) {
    address = item.getString("utf-8");
    System.out.println(address);
   }
   if ("picturePath".equals(name)) {
    picturePath = item.getString("utf-8");
    System.out.println(picturePath);
   }
   } else {// 是文件上传表单控件
    // 得到文件名 xxx.jpg
   String sourceFileName = item.getName();
   // 得到文件名的扩展名:.jpg
   String extendedName = sourceFileName.substring(
    sourceFileName.lastIndexOf("."),
    sourceFileName.length());
   // 把文件名称重命名为全球唯一的文件名
   String uniqueName = UUID.randomUUID().toString();
   saveFileName = uniqueName + extendedName;
   // 得到上传到服务器上的文件路径
   // C:\\apache-tomcat-7.0.47\\webapps\\taobaoServlet4\\upload\\xx.jpg
   String uploadFilePath = request.getSession()
    .getServletContext().getRealPath("upload/");
   File saveFile = new File(uploadFilePath, saveFileName);
   // 把保存的文件写出到服务器硬盘上
   try {
    item.write(saveFile);
   } catch (Exception e) {
    e.printStackTrace();
   }
   }
  }
  } catch (NumberFormatException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (FileUploadException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }
 // 2、封装数据
 User user = new User(id, username, password, sex, birthday, address,
  saveFileName);
 // 3、调用逻辑层API
 IUserService iUserService = new UserServiceImpl();
 // 4、控制跳转
 HttpSession session = request.getSession();
 if (iUserService.save(user) > 0) {
  System.out.println("添加新用户成功!");
  List<User> users = new ArrayList<User>();
  users = iUserService.listAll();
  session.setAttribute("users", users);
  response.sendRedirect("UserServlet?action=getPage");
 } else {
  System.out.println("添加新用户失败!");
  PrintWriter out = response.getWriter();
  out.print("<script type='text/javascript'>");
  out.print("alert('添加新用户失败!请重试!');");
  out.print("</script>");
 }
 }

修改用户时注意考虑图片更改和没更改这两种情况,图片更改时要先获取原图片并删除其在服务器上的图片,再添加新图片到服务器;图片不更改时则无需更新图片路径。

 // 改
 public void update(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 System.out.println("update方法被调用");
 HttpSession session = request.getSession();
 // 获取数据
 int id = (int)session.getAttribute("id");
 String username = null;
 String password = null;
 String sex = null;
 Date birthday = null;
 String address = null;
 String saveFileName = null;
 String picturePath = null;
 IUserService iUserService = new UserServiceImpl();
 // 得到表单是否以enctype="multipart/form-data"方式提交
 boolean isMulti = ServletFileUpload.isMultipartContent(request);
 if (isMulti) {
  // 通过FileItemFactory得到文件上传的对象
  FileItemFactory fif = new DiskFileItemFactory();
  ServletFileUpload upload = new ServletFileUpload(fif);
  try {
  List<FileItem> items = upload.parseRequest(request);
  for (FileItem item : items) {
   // 判断是否是普通表单控件,或者是文件上传表单控件
   boolean isForm = item.isFormField();
   if (isForm) {// 是普通表单控件
   String name = item.getFieldName();
   if ("sex".equals(name)) {
    sex = item.getString("utf-8");
    System.out.println(sex);
   }
   if ("username".equals(name)) {
    username = item.getString("utf-8");
    System.out.println(username);
   }
   if ("password".equals(name)) {
    password = item.getString("utf-8");
    System.out.println(password);
   }
   if ("birthday".equals(name)) {
    String birthdayStr = item.getString("utf-8");
    SimpleDateFormat sdf = new SimpleDateFormat(
     "yyyy-MM-dd");
    try {
    birthday = sdf.parse(birthdayStr);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    System.out.println(birthday);
   }
   if ("address".equals(name)) {
    address = item.getString("utf-8");
    System.out.println(address);
   }
   if ("picturePath".equals(name)) {
    picturePath = item.getString("utf-8");
    System.out.println(picturePath);
   }
   } else {// 是文件上传表单控件
    // 得到文件名 xxx.jpg
   picturePath = item.getName();
   if (picturePath != "") {// 有选择要上传的图片
    // 得到文件名的扩展名:.jpg
    String extendedName = picturePath.substring(
     picturePath.lastIndexOf("."),// 截取从最后一个'.'到字符串结束的子串。
     picturePath.length());
    // 把文件名称重命名为全球唯一的文件名
    String uniqueName = UUID.randomUUID().toString();
    saveFileName = uniqueName + extendedName;// 拼接路径名
    // 得到上传到服务器上的文件路径
    // C:\\apache-tomcat-7.0.47\\webapps\\CommonhelloWorldServlet\\upload\\xx.jpg
    String uploadFilePath = request.getSession()
     .getServletContext().getRealPath("upload/");
    File saveFile = new File(uploadFilePath,
     saveFileName);
    // 把保存的文件写出到服务器硬盘上
    try {
    item.write(saveFile);
    } catch (Exception e) {
    e.printStackTrace();
    }
    // 3、调用逻辑层 API
    // 根据id查询用户并获取其之前的图片
    User user = iUserService.getUserById(id);
    String oldPic = user.getPicturePath();
    String oldPicPath = uploadFilePath + "\\" + oldPic;
    File oldPicTodelete = new File(oldPicPath);
    oldPicTodelete.delete();// 删除旧图片
   }
   }
  }
  } catch (NumberFormatException e) {
  e.printStackTrace();
  } catch (FileUploadException e) {
  e.printStackTrace();
  }
 }
 System.out.println(id + "\t" + username + "\t" + password + "\t" + sex
  + "\t" + address + "\t" + picturePath + "\t" + birthday);

 // 2、封装数据
 User user = new User(id, username, password, sex, birthday, address,
  saveFileName);

 if (iUserService.update(user) > 0) {
  System.out.println("修改数据成功!");
  List<User> users = new ArrayList<User>();
  users = iUserService.listAll();
  session.setAttribute("users", users);
  // 4、控制跳转
  response.sendRedirect("UserServlet?action=getPage");
 } else {
  System.out.println("修改数据失败!");
  PrintWriter out = response.getWriter();
  out.print("<script type='text/javascript'>");
  out.print("alert('修改数据失败!请重试!');");
  out.print("</script>");
 }
 }

删除的话就比较简单了,直接获取原图片路径并删除,则原图片在服务器上被删除。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • servlet+JSP+mysql实现文件上传的方法

    本文实例讲述了servlet+JSP+mysql实现文件上传的方法.分享给大家供大家参考,具体如下: 一.文件上传的基本操作: 1. 表单属性enctype的设置 multipart/form-data和application/x-www-form-urlencoded的区别 FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是"application/x-www-form-urlencoded". 然而,在向服务器发送大量的文本.包含非ASCI

  • Jsp+Servlet实现文件上传下载 文件列表展示(二)

    接着上一篇讲: Jsp+Servlet实现文件上传下载(一)--文件上传 本章来实现一下上传文件列表展示,同时优化了一下第一章中的代码. 废话少说,上代码 mysql创建附件表 DROP TABLE tbl_accessory; CREATE TABLE tbl_accessory ( id INT AUTO_INCREMENT PRIMARY KEY, file_name VARCHAR(500), file_size DOUBLE(10,2), file_ext_name VARCHAR(1

  • Jsp+Servlet实现文件上传下载 删除上传文件(三)

    接着上一篇讲:Jsp+Servlet实现文件上传下载(二)--文件列表展示 本章来实现一下删除已上传文件,同时优化了一下第一章中的代码. 废话少说,上代码得意 1.调整列表页面list.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/j

  • JSP servlet实现文件上传下载和删除

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 由于存储空间,对一般用户而言,就是用来操作存储文件的,所以这两天,特意看了一下windows下用servlet实现文件上传.下载和删除,下面是详细代码说明 上传: 用的是commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar组件,可以去apache官网上去下载,然后放到WebRoot/WEB-INF/lib目录下 upload.html <html> <hea

  • jsp+servlet实现文件上传与下载功能

    本文实例为大家分享了jsp servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 上传: 需要导入两个包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.Http

  • Jsp+Servlet实现文件上传下载 文件上传(一)

    文件上传和下载功能是Java Web必备技能,很实用. 本文使用的是Apache下的著名的文件上传组件 org.apache.commons.fileupload 实现 下面结合最近看到的一些资料以及自己的尝试,先写第一篇文件上传.后续会逐步实现下载,展示文件列表,上传信息持久化等. 废话少说,直接上代码 第一步,引用jar包,设置上传目录 commons-fileupload-1.3.1.jar commons-io-2.4.jar 上传目录:WEB-INF/tempFiles和WEB-INF

  • JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao.service.servlet 这三层是主要的结构,类似 MVC 架构,Dao是模型实体类(逻辑层),service是服务层,servlet是视图层,三者协作共同完成项目. 这里的User是由user表来定义的一个类,再封装增删改查等操作,实现从数据库查询与插入,修改与删除等操作,并实现了分页操作,也实现了将图片放到服务器上运行的效

  • JavaWeb Servlet实现文件上传与下载功能实例

    目录 前言 项目准备 文件上传 前台页面 文件下载 资源准备 超链接下载 后台实现下载 总结 前言 在上网的时候我们常常遇到文件上传的情况,例如上传头像.上传资料等:当然除了上传,遇见下载的情况也很多,接下来看看我们 servlet 中怎么实现文件的上传和下载. 项目准备 idea:2020.1 jdk:1.8 tomcat:10 项目模板:java Enterprise–>Web Application 文件上传 文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保

  • 基于HTML5+js+Java实现单文件文件上传到服务器功能

    上传单文件到服务器       应公司要求,在HTML5页面上实现上传文件到服务器,对于一个还没毕业的实习生菜鸟来说,这可不得了-----不会,网上各种百度,找各种博客还是没解决,最后还是请教了公司的大神,人家给卸了一个例子,然后根据人家写的终于把这个上传文件搞定. 好了,开始上代码. HTML5代码: <form name="upform" action="" method="POST"> <input type ="

  • servlet实现文件上传与下载功能

    本文实例为大家分享了servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 内容 我们分两大模块来进行讲解,即上传的实现,与下载的实现 上传的实现 注意了我们在写上传表单的时候必须声明提交方式为post类型,enctype="multipart/form-data",这样的话才能实现上传. 当我们提交表单的时候看看响应体中都有什么内容: 好了,我们有了数据了,接下来我们怎么提取数据呢,注意我们已经不能使用requeest.getParamter()方法来进行参数的提取了,

  • Java实现文件上传至服务器的方法

    在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去. 如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些图片,文档上传到服务器上面去.然后其他用户可以去下载这些文件,那么这样的话,我们可以自己编程实现文件的上传 但是更好的方式是使用一些已有的组件帮助我们实现这种上传功能. 常用的上传组件: Apache 的 Commons FileUpload JavaZoom的UploadBean jspSmartUpload upload.jsp 代码: <%@ pag

随机推荐