Servlet文件上传/上传文件功能的实现(commons-fileupload)

文章目录

  • 正常步骤
  • 使用 commons-fileupload.jar 实现文件上传

正常步骤

step1
在 form 中,设置 method="post",设置 enctype="multipart/form-data"。enctype 属性用于设置表单的编码方式,对于文件上传,必须设置成"multipart/form-data"。

step2
在 Servlet 类当中,不能够使用 request.getParameter() 方法来获得参数值。要使用 InputStream request.getInputStream(); 分析 InputStream 来获得参数值。直接分析 InputStream 比较复杂,一般使用一些封装好的工具(比如 Apache 提供的 commons-fileupload.jar)来获得参数值。

使用 commons-fileupload.jar 实现文件上传

Maven 作为构建工具,添加依赖:

 <dependency>
            <groupId>commons-fileuploadgroupId>
            <artifactId>commons-fileuploadartifactId>
            <version>1.3.1version>
        dependency>

FileUploadServlet 的代码:

package priv.lwx.servlet.web;

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

import javax.servlet.ServletContext;
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 java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * description
 *
 * @author liaowenxiong
 * @date 2022/2/28 19:48
 */
@WebServlet("/fileupload")
public class FileUploadServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 创建DiskFileItemFactory对象,该对象为解析器提供了缺省的配置
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // 创建解析器
    ServletFileUpload sfu = new ServletFileUpload(factory);
    // 使用解析器解析
    try {
      List<FileItem> items = sfu.parseRequest(req);
      // 遍历集合
      for (int i = 0; i < items.size(); i++) {
        FileItem fileItem = items.get(i);
        // 读取表单域中的数据时,要区分表单域的类型
        if (fileItem.isFormField()) {
          // 普通表单域
          String userName = fileItem.getString();
          System.out.println("userName:" + userName);
        } else {
          // 文件上传表单域
          ServletContext sctx = getServletContext();
          // 获取文件上传目标目录的路径
          String path = sctx.getRealPath("upload");// 会在upload的前面加上部署项目的项目根路径
          // 这里要构造File对象,是为了判断目录upload是否存在,不存在则创建
          File file = new File(path);
          if (!file.exists()) {
            file.mkdir();
          }
          // 获取文件名
          String fileName = fileItem.getName(); // image.jpeg
          /*// 截取文件的扩展名,例如:.jpeg
          fileName = fileName.substring(fileName.lastIndexOf("."));
          // 自定义文件名称
          fileName = UUID.randomUUID().toString().replace("-", "") + fileName;
          System.out.println("上传到服务器后的文件名称:" + fileName);*/
          File file1 = new File(path + File.separator + fileName);
          System.out.println("上传到服务器后的文件路径:" + file1);
          // 将数据输出到目标文件中
          fileItem.write(file1);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException(e);
    }
  }
}

页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Titletitle>
head>
<body style="font-size: 30px;">
<form action="fileupload" method="post" enctype="multipart/form-data">
    username:<input name="userName"/><br/>
    选择一个文件:<input type="file" name="file"/><br/>
    <input type="submit" value="提交"/>
form>
body>
html>

你可能感兴趣的:(java,Servlet,文件上传)