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中的一个组件。
前端文件上传页面
文件上传注意事项
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(); } } } }