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();
           }
       }
   }

}

 

posted @ 2018-12-04 00:15  一线大码  Views(898)  Comments(0Edit  收藏  举报