• Apache Commons FileUpload 实现文件上传


    Commons FileUpload简介

    Apache Commons是一个专注于可重用Java组件开发的 Apache 项目。Apache Commons项目由三个部分组成:

    1、Commons Proper - 可重用Java组件的存储库。

    2、The Commons Sandbox - 用于Java组件开发的工作区。

    3、The Commons Dormant - 当前不活动的组件存储库。

    Commons-FileUpload是Commons Proper中的一个组件,该组件依赖于Commons-IO ,Commons-IO也是 Commons Proper中的一个组件。

    Commons FileUpload 的JAR包下载

    Commons IO 的JAR包下载

    前端文件上传页面

    文件上传注意事项

    FileUpload能解析符合HTML中基于表单的文件上载的HTTP请求 。也就是说,如果使用POST方法提交HTTP请求,并且内容类型为“multipart / form-data”,则FileUpload可以解析该请求,并使结果易于使用。

    1、只能使用POST请求,GET请求只能提交普通的字符串(这是HTTP协议规定!)

    2、form表单的文件控件是type="file"的input控件。

    3、form标签的enctype属性是用来规定在发送表单数据之前如何对其进行编码,必须设置为:multipart/form-data。

    enctype属性

    enctype属性可能的值:application/x-www-form-urlencoded | multipart/form-data | text/plain。

    enctype属性默认值是:application/x-www-form-urlencoded,表示普通的form表单元素提交,在发送前编码所有字符,提交的参数格式遵循:name=value&name=value&name=value...。

    multipart/form-data,表示不对字符编码。直接提交二进制文件流。在使用包含文件上传控件的form表单时,必须使用该值。

    text/plain,表示空格转换为 "+" 加号,但不对特殊字符编码。

    index.jsp页面代码

    <%@page contentType="text/html; charset=utf-8"%>
    <!doctype html>
    <html>
        <head>
            <title>apache commons fileupload</title>
        </head>
        <body>
            
            <form action="${pageContext.request.contextPath }/fileupload" method="post" enctype="multipart/form-data">
                <%-- 普通的控件 --%>
                username<input type="text" name="username"><br> <%-- FileItem --%>
                <%-- 文件控件 --%>
                file1<input type="file" name="file1"><br> <%-- FileItem --%>
                file2<input type="file" name="file2"><br> <%-- FileItem --%>
                <input type="submit" value="submit">
            </form>
            
        </body>
    </html>

    后端接收文件接口

    准备JAR包,添加到项目中

    Servlet代码

    package com.wb.controller;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    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 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;
    
    @WebServlet(urlPatterns = {"/fileupload"})
    public class FileUpController extends HttpServlet{
    
       private static final long serialVersionUID = 5351212300627874456L;
    
       @Override
       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           
           //创建一个“硬盘文件条目工厂”对象
           DiskFileItemFactory factory = new DiskFileItemFactory();
           //设置阈值,设置JVM一次能够处理的文件大小(默认吞吐量是10KB)
           factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);
           //设置临时文件的存储位置(文件大小大于吞吐量的话就必须设置这个值,比如文件大小:1GB ,一次吞吐量:1MB)
           factory.setRepository(new File("E:\TestFileUpload\files"));
           
           //创建核心对象
           ServletFileUpload fileUpload = new ServletFileUpload(factory);
           //设置最大可支持的文件大小(10MB)
           fileUpload.setFileSizeMax(1024*1024*10);
           //设置转换时使用的字符集
           //fileUpload.setHeaderEncoding("UTF-8");
           
           if (ServletFileUpload.isMultipartContent(req)) {
               try {
                   //解析请求
                   List<FileItem> fileItems = fileUpload.parseRequest(req);
                   for (FileItem fileItem : fileItems) {
                       if(fileItem.isFormField()) {//判断该FileItem为一个普通的form元素
                           //获取字段名
                           String fieldName = fileItem.getFieldName();
                           //获取字段值,并解决乱码
                           String fieldValue = fileItem.getString("UTF-8");
                           //String fieldValue = fileItem.getString();
                           System.out.println(fieldName + ":" + fieldValue);
                       }else {//判断该FileItem为一个文件
                           //获取文件名
                           String fileName = fileItem.getName();
                           System.out.println("fileName=" + fileName);
                           //获取文件大小
                           long fileSize = fileItem.getSize();
                           System.out.println("fileSize=" + fileSize);
                           fileItem.write(new File("E:\TestFileUpload\files" + File.separator + fileName));
                       }
                   }
               } catch (FileUploadException e) {
                   e.printStackTrace();
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
       }
    
    }
  • 相关阅读:
    Oracle中的rownum
    关于Oracle12c中无scott用户的问题
    docker 1.13 是什么版本?
    ImportError: cannot import name 'SQLALchemy'
    mac配置iterm2,iterm2使用方法
    docker 时区
    jupyter 500 : Internal Server Error
    sublime conda 切换环境
    mac frida安装(使用网易木木模拟器)
    \u开头两个字符的是什么编码?
  • 原文地址:https://www.cnblogs.com/wbxk/p/10061882.html
Copyright © 2020-2023  润新知