博客
关于我
使用 FileUpload 实现文件上传
阅读量:360 次
发布时间:2019-03-05

本文共 3594 字,大约阅读时间需要 11 分钟。

文章目录


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"%>			apache commons fileupload						
<%-- 普通的控件 --%> username
<%-- FileItem --%> <%-- 文件控件 --%> file1
<%-- FileItem --%> file2
<%-- FileItem --%>

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

转载地址:http://oqcg.baihongyu.com/

你可能感兴趣的文章
VS环境变量(转)
查看>>
C++中找资源或者函数的方法
查看>>
一些留给自己的思考题(只求回过头来能够有所获)
查看>>
SQL函数返回表的写法
查看>>
delete对象时会自动调用类的析构函数
查看>>
C++ 子类对象直接赋值给父类对象可行,反过来不行
查看>>
WMWare下安装centOS7,并使用xshell进行连接记录.
查看>>
linux下同一个动态库名为何辣么多的.so文件
查看>>
SQL联表的方式(逗号, Left Join, Right Join)
查看>>
牛客网输入输出举例
查看>>
字符串初始化时的注意点
查看>>
dll路径加载顺序
查看>>
悬垂指针和野指针的区别
查看>>
软考相关试题
查看>>
顺序表的操作
查看>>
常量表达式
查看>>
POD类型
查看>>
安装HDF5及在VS下配置HDF5
查看>>
const与常量,傻傻分不清楚~
查看>>
图解哈希表及其原理
查看>>