FileUpload使用教程

FileUpload使用教程

官方API文档:http://commons.apache.org/proper/commons-fileupload/using.html

第一步:解析请求:
目标:确保该请求为文件上传请求,否则需要返回前端页面重新请求

// Check that we have a file upload request
// 返回值说明:true 请求为文件上传;false 不是文件上传请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);

第二步:创建基于磁盘管理的文件工厂:
目标:管理、接收上传的文件
原则:阿帕奇官方在文档中说明了一些必须遵守的原则:

  1. 上传的小文件可以保存在内存中。
  2. 较大的项目应写入磁盘上的临时文件。
  3. 不允许非常大的上传请求。
  4. 要设置3个参数**(重要)**项目最大大小、上传请求最大允许大小以及临时文件的位置
// 创建文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();

// 获取临时存储目录
ServletContext servletContext = this.getServletConfig().getServletContext();
File respository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");

// 设置工厂限制 -- 设置内存临界值(超过该界限将文件存储在临时目录中)、临时存储目录
factory.setSizeThreshold(yourMaxMemorySize)
factory.setRespository(repository);
// 除此之外可以使用构造方法:DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize, yourTempDirectory);

第三步:创建文件上传的管理者:
目标:通过该实例解析请求,获得每一个表单项

// 创建一个文件上传的管理者
ServletFileUpload upload = new ServletFileUpload(factory);

// 设置最大请求限制以及最大文件上传值
uoload.setSizeMax(yourMaxRequestSize);
upload.setFileSizeMax(yourMaxFileSize);

// 解析请求,List存放着所有请求的表单项
List<FileItem> items = upload.parseRequest(request);

第四步:处理表单项
目标:获得所有表单项,这里区别普通项以及图片项,具体做法如下:

// 处理表单项
Iterator<FileItem> iter = items.iterator();
while(iter.hasNext()) {
	FileItem item = iter.next();
    if (item.isFormField()) {
    	// 普通项,正常处理即可
        // 例如
		String name = item.getFileName();
        String value = item.getString();
    } else {
        // 图片,需要使用FileUpload处理
    	String fieldName = item.getFieldName();
        String fileName = item.getName();
        String contentType = item.getContentType();
        boolean isInMemory = item.isInMemory();
        long sizeInBytes = item.getSize();
        ...
        // 你可以将他写入硬盘或者变成InputStream
        if (writeToFile) {
        File uploadedFile = new File(...);
        item.write(uploadedFile);
        } else {
        InputStream uploadedStream = item.getInputStream();
        ...
        uploadedStream.close();
        }
    }
}

第五步:清理资源
只需要在web.xml中配置如下代码即可:

<web-app>
  ...
  <listener>
    <listener-class>
      org.apache.commons.fileupload.servlet.FileCleanerCleanup
    </listener-class>
  </listener>
  ...
</web-app>

以下是一个实现类:

// 比较不错的上传代码示例
package com.db.servlet;

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

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

/**

  • @author Administrator

  • @date 2020/10/3111:44
    /
    @WebServlet("/updateGoodsServlet")
    public class UpdateGoodsServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    /
    *

    • UPLOAD_DIRECTORY 上传文件存储目录
      /
      private static final String UPLOAD_DIRECTORY = “upload”;
      // 上传配置 3\40\50MB
      private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3;
      private static final int MAX_FILE_SIZE = 1024 * 1024 * 40;
      private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50;
      /
      *
    • 上传数据及保存文件
      */
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // 1.设置编码
      request.setCharacterEncoding(“utf-8”);
      response.setCharacterEncoding(“utf-8”);
      // 检测是否为多媒体上传
      if (!ServletFileUpload.isMultipartContent(request)) {
      // 如果不是则停止
      RequestDispatcher dispatcher = request.getRequestDispatcher("/UpdateGoods.jsp");
      dispatcher.forward(request,response);
      }
      // 配置上传参数
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
      factory.setSizeThreshold(MEMORY_THRESHOLD);
      // 设置临时存储目录
      factory.setRepository(new File(System.getProperty(“java.io.tmpdir”)));
      ServletFileUpload upload = new ServletFileUpload(factory);
      // 设置最大文件上传值
      upload.setFileSizeMax(MAX_FILE_SIZE);
      // 设置最大请求值 (包含文件和表单数据)
      upload.setSizeMax(MAX_REQUEST_SIZE);
      // 构造临时路径来存储上传的文件
      // 这个路径相对当前应用的目录
      String uploadPath = getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY;
      // 如果目录不存在则创建
      File uploadDir = new File(uploadPath);
      if (!uploadDir.exists()) {
      uploadDir.mkdir();
      }
      try {
      // 解析请求的内容提取文件数据
      @SuppressWarnings(“unchecked”)
      List formItems = upload.parseRequest(request);
      if (formItems != null && formItems.size() > 0) {
      // 迭代表单数据
      for (FileItem item : formItems) {
      // 普通项
      if (item.isFormField()) {
      return;
      }
      // 文件项
      else {
      String fileName = new File(item.getName()).getName();
      // 判断传输进来的图片是否为图片
      if (fileName == null){
      RequestDispatcher dispatcher = request.getRequestDispatcher("/UpdateGoods.jsp");
      dispatcher.forward(request,response);
      }
      else if (
      fileName.endsWith(“jpg”) | fileName.endsWith(“png”) | fileName.endsWith(“jpeg”) | fileName.endsWith(“gif”) ){
      String filePath = uploadPath + File.separator + fileName;
      File storeFile = new File(filePath);
      // 在控制台输出文件的上传路径
      System.out.println(filePath);
      // 保存文件到硬盘
      item.write(storeFile);
      // 图片保存成功且获得上传路径,创建二手商品实体类,并将数据存入
      //
      request.setAttribute(“message”,
      “文件上传成功!”);
      }
      else {
      RequestDispatcher dispatcher = request.getRequestDispatcher("/UpdateGoods.jsp");
      dispatcher.forward(request,response);
      }
      }
      }
      }
      } catch (Exception ex) {
      request.setAttribute(“message”,
      “错误信息: " + ex.getMessage());
      }
      RequestDispatcher dispatcher = request.getRequestDispatcher(”/getPictureServlet");
      dispatcher.forward(request,response);
      }

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值