使用 FileUpload 实现文件上传


1. 工具简介

在这里插入图片描述
Apache Commons 官方网站。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 中的一个组件。

2. 前端页面

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

2.1. 注意事项

(1)只能使用POST请求,GET请求只能提交普通字符串(这是 HTTP 协议规定!)
(2)form 表单中的文件控件是type="file"input控件。
(3)form 标签的enctype属性规定在发送表单数据之前如何对其进行编码,必须设置为:multipart/form-data,表示提交二进制文件。

2.2. enctype

enctype 属性可能的值有三种:
(1)application/x-www-form-urlencoded,是 enctype 默认值,表示普通的 form 表单元素提交,在发送前编码所有字符,提交格式遵循:name=value&name=value&name=value...
(2)multipart/form-data,表示提交二进制数据流,不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
(3)text/plain,表示空格转换为"+"加号,但不对特殊字符编码。

2.3. 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>

3. 后端代码

3.1. 添加依赖

将准备的JAR包,添加到项目lib目录中。
在这里插入图片描述

3.2. 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();
   		}
   	}
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值