基于servlet完成文件上传功能

简介: 基于servlet完成文件上传功能

本次文件依靠第三方组件(Apache)进行实现

commons-fileupload组件

拷贝jar包:
commons-fileupload.jar
下载地址:
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
操作指南:
http://commons.apache.org/proper/commons-fileupload/using.html
commons-io.jar
下载地址:
http://commons.apache.org/proper/commons-io/download_io.cgi
操作指南:
http://commons.apache.org/proper/commons-io/description.html
文件上传的前提

1.form表单的method必须是post
2.form表单的组件得是file属性:比如:<input type="file" name="photoName" >

3.form表单的enctype必须是multipart/form-data 以二进制字节流进行提交 传统接收参数的方式无效

配套代码Demo下载地址:

https://download.csdn.net/download/kese7952/11086493

代码一 演示

jsp上传页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
  <head>
    <title>MrYang Design File Upload</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/servlet/UploadServlet" enctype="multipart/form-data" method="post" >
      名称<input type="text" name="name" ><br/><br/>
      密码<input type="text" name="pwd" ><br/><br/>
      <input type="file" name="photoName" ><br/><br/>
    <input type="submit" value="上传" >
    </form>
  </body>
</html>

2.Servlet进行接受表单数据、并且进行处理上传内容

package cn.javabs.web.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

public class UploadServlet extends HttpServlet {

  @SuppressWarnings("unchecked")
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    /**
     * Set CharEncoding
     */
    response.setContentType("text/html ;charset = utf-8 ");
    response.setCharacterEncoding("utf-8");
    request.setCharacterEncoding("utf-8");

    String name = request.getParameter("photoName");

    //  1. 用于判断jsp表单中的enctype 的属性值是不是multipart/form-data
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    // 如果不是multipart/form-data 则提醒
    if (!isMultipart) {
      response.getWriter().write("提交的不是multipart/form-data");
      return;
    }
    //实例化 磁盘文件项工厂对象  
    DiskFileItemFactory factory = new DiskFileItemFactory();

    //ServletFileUpload是用于解析request对象
    ServletFileUpload upload = new ServletFileUpload(factory);

    List<FileItem> items = null;

    try {
    //  通过ServletFileUpload得到所有上传项.每一个FileItem就相当于一个上传项
      items = upload.parseRequest(request);
    } catch (FileUploadException e) {
      throw new RuntimeException(e);
    }
    System.out.println("我们来一起看一下items是:" + items);
    // 循环取出所有的组件  其中组件包含有  普通组件 和  上传组件
    for (FileItem item : items) {
    //  通过判断确定 item中的普通组件   使用的判断方法是isFormField 
      // 是普通的表单字段
      if(item.isFormField()){
        System.out.println("这是普通的表单字段");
        // 获取表单中的属性  
        String fieldName = item.getFieldName();
        // 获取表单中的属性所对应的值  
        String fieldValue = item.getString();
        
        System.out.println(fieldName +":" + fieldValue);
      } 
      // 是上传的表单字段
      else{
        System.out.println("这是上传的表单字段");
        // 获取字节输入流
        InputStream in = item.getInputStream();
        
        // 获取上传文件的名称
        String uploadName = item.getName();
        
        // 判断上传文件的名称是否为null,如果不为空
        if(uploadName != null){
          // 文件名称     =    获取文件名称,并且包含后缀
          uploadName = FilenameUtils.getName(uploadName);
        }
        
        // 文件存放的真实路径   其实files文件夹 存放在Tomcat服务器的项目里面
        String filePath = getServletContext().getRealPath("/files");
        
        // 根据真实的路径 进行实例化创建目录
        File file = new File(filePath);
        
        // 如果目录不存在
        if(!file.exists()){
          //创建多级目录
          file.mkdirs();
        }
        // 根据  真实目录  + "\" + 文件名称  [file.separator 的结果是 "\"]
        OutputStream out = new FileOutputStream(filePath +  file.separator + uploadName );
        
        // 定义长度  初始化值为0
        int len = 0;
        
        //定义字节缓冲区数组
        byte [] b = new byte[1024];
        
        // 循环
        while ((len = in.read(b))!=-1) {
          out.write(b, 0, len);
        }
        // 关闭输出流
        out.close();
        // 关闭输入流
        in.close();
        // 删除临时文件
        item.delete();
      }
    }

  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    this.doGet(request, response);

  }

}

最后还有一个核心配置文件web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>cn.javabs.web.controller.UploadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/servlet/UploadServlet</url-pattern>
  </servlet-mapping>  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

目录
相关文章
|
7月前
|
Java 应用服务中间件 数据库
Servlet实现注册登录列表页面及其相互跳转功能
Servlet实现注册登录列表页面及其相互跳转功能
80 1
|
7月前
|
前端开发 Java Maven
Eclipse里使用Servlet实现简单的登录功能
Maven是一款非常方便的Java开发插件,它可以自动管理好开发过程中需要的jar包,提升开发者们的开发效率。在这里,我手把手教给大家如何新建一个Maven项目,并实现简单的用户登录功能。
203 0
|
7月前
|
Java 开发者
Servlet 教程 之 Servlet 文件上传 1
Servlet 文件上传教程展示了如何利用 HTML 表单和 Servlet 处理文件上传。关键点包括:POST 方法的 form,enctype 设为 &quot;multipart/form-data&quot;,以及 action 指向如 UploadServlet 的处理程序。所需的 jar 包有 commons-fileupload-1.3.2 和 commons-io-2.5.jar。Servlet 3.0 已内置文件上传支持,无需额外组件。示例的 upload.jsp 文件包含一个单文件上传表单,使用 input[type=&quot;file&quot;] 元素。
86 5
|
7月前
|
XML 数据格式
Servlet 教程 之 Servlet 文件上传 3
该教程介绍了如何使用Servlet进行文件上传。在web.xml中配置了Servlet `UploadServlet`,类为`com.baidu.test.UploadServlet`,映射路径为`/TomcatTest/UploadServlet`。用户需通过创建的HTML表单提交文件,访问URL为:http://localhost:8080/TomcatTest/upload.jsp。
39 0
|
7月前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
75 2
|
7月前
|
Web App开发 XML Java
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
126 2
|
6月前
|
Java 应用服务中间件 开发工具
基于Servlet的3.1以上注解方式完成上传功能。
基于Servlet的3.1以上注解方式完成上传功能。
30 0
|
6月前
|
SQL 数据可视化 数据库
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
29 0
|
7月前
|
缓存 前端开发 Java
15:Servlet 3.0文件上传与下载-Java Web
15:Servlet 3.0文件上传与下载-Java Web
205 5
|
Java
java servlet 文件上传 req.getPart null 返回空值
java servlet 文件上传 req.getPart null 返回空值
150 0