Java 使用 commons-fileupload 实现文件上传工具类
依赖包
文件上传可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io
commons-io.jar: https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
commons-fileupload: https://repo1.maven.org/maven2/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar
maven地址
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
代码
package com.pro.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;
public class UploadFileServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UploadFileServlet02 POST");
// 判断表单是普通表单还是带文件的表单
if (!ServletFileUpload.isMultipartContent(req)) {
return; // 终止方法
}
// 创建上传文件的保存路径, 建议在 WEN-INF 路径下, 安全且用户无法直接访问
String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
File uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
// 如果文件夹不存在, 就创建
uploadFile.mkdir();
}
// 缓存, 临时文件, 假如文件超出了预期大小, 就放到临时文件中, 过几天删除, 或者转为永久文件
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
// 如果文件夹不存在, 就创建
uploadFile.mkdir();
}
// 处理文件上传, 一般通过获取流, request.getInputStream() 原生方式十分麻烦
// 可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io 组件
// 1. 创建 DiskFileItemFactory 对象, 处理文件上传路径或者大小限制
DiskFileItemFactory factory = getDiskFileItemFactory(uploadFile);
// 2. 获取 ServletFileUpload 对象负责处理上传文件数据, 可以监听文件上传进度, 以及编码问题
ServletFileUpload upload = getServletFileUpload(factory);
// 3. 处理上传文件
String msg = uploadParamsRequest(upload, uploadPath, req);
req.setAttribute("msg", msg);
req.getRequestDispatcher("info.jsp").forward(req, resp);
}
// 获取 DiskFileItemFactory 对象, 处理文件上传路径或者大小限制
public static DiskFileItemFactory getDiskFileItemFactory(File file) {
// 处理文件上传, 一般通过获取流, request.getInputStream() 原生方式十分麻烦
// 可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io 组件
// 1. 创建 DiskFileItemFactory 对象, 处理文件上传路径或者大小限制
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置一个缓冲区大小, 当文件大于这个缓冲区大小的时候, 就会放到临时目录
factory.setSizeThreshold(1024 * 1024); // 缓冲区大小 1 M
factory.setRepository(file); // 设置临时目录, 接收一个 File
return factory;
}
// 获取 ServletFileUpload 对象负责处理上传文件数据, 可以监听文件上传进度, 以及编码问题
public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
// 2. 获取 ServletFileUpload 对象负责处理上传文件数据, 可以监听文件上传进度, 以及编码问题
ServletFileUpload upload = new ServletFileUpload(factory);
// 监听文件上传进度
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long readBytes, long contentLength, int i) {
System.out.println("总大小: " + contentLength + " 已上传进度: " + readBytes);
}
});
// 处理乱码问题
upload.setHeaderEncoding("UTF-8");
// 设置单个文件最大值
upload.setFileSizeMax(1024 * 1024 * 10);
// 设置总共能够上传文件大小
upload.setFileSizeMax(1024 * 1024 * 10); // 10M
return upload;
}
// 保存文件
public static String uploadParamsRequest(ServletFileUpload upload, String uploadPath, HttpServletRequest req) {
String msg = "";
try {
// 3. 处理上传文件
// 解析前段请求, 封装成一个 FileItem 对象, 需要从 ServletFileUpload 对象中获取
List<FileItem> fileItems = upload.parseRequest(req);
for (FileItem fileItem : fileItems) {
// 判断上传文件是普通表单还是带文件的表单, true 代表普通表单, false 代表文件表单
if (fileItem.isFormField()) {
// 普通表单, 获取name属性
String fieldName = fileItem.getFieldName();
String value = fileItem.getString("UTF-8"); // 处理乱码
System.out.println(fieldName + " : " + value);
} else {
//===================处理文件===================
// 获取文件名
String uploadFileName = fileItem.getName();
System.out.println("上传的文件名: " + uploadFileName);
// 判断文件名是否合法, 不合法直接跳过
if (uploadFileName.trim().equals("") || uploadFileName == null) {
continue;
}
// 获取上传的文件名
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
// 获取上传文件后缀
String uploadExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
System.out.println("文件信息 [文件名: " + fileName + " ---文件类型: " + uploadExtName + "]");
// 网络传输中的东西需要 序列化(Serializable) 才能传输 Serializable: 标记接口, JVM --> Java栈 、 本地方法栈 native --> c++
// 使用 UUID (唯一识别通用码), 保证文件名唯一
UUID uuidPath = UUID.randomUUID();
//===================存放地址===================
// 文件真实存放的地址 readPath
String readPath = uploadPath + File.separator + uuidPath;
// 给文件开辟一个文件夹
File readPathFile = new File(readPath);
if (!readPathFile.exists()) {
// 如果没有该文件夹, 就创建
readPathFile.mkdir();
}
//===================文件传输===================
// 获取输入流
InputStream is = fileItem.getInputStream();
// 获取文件输出流
FileOutputStream fos = new FileOutputStream(readPathFile + File.separator + fileName);
// 建立缓存区
byte[] buffer = new byte[1024 * 1024];
int len = 0;
// 读取流
while ((len = is.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
// 关闭流
fos.close();
is.close();
// 清除临时文件
fileItem.delete();
}
}
msg = "文件上传成功";
} catch (Exception e) {
e.printStackTrace();
msg = "文件上传失败";
}
return msg;
}
}
Java 使用 commons-fileupload 实现文件上传工具类的更多相关文章
- 文件上传工具类 UploadUtil.java
package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...
- spring boot 文件上传工具类(bug 已修改)
以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...
- spring mvc 文件上传工具类
虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...
- FastDFS 文件上传工具类
FastDFS文件上传工具类 import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; imp ...
- Apache Commons fileUpload实现文件上传之一
需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package ...
- Spring MVC使用commons fileupload实现文件上传功能
通过Maven建立Spring MVC项目,引入了Spring相关jar依赖. 1.为了使用commons fileupload组件,需要在pom.xml中添加依赖: <properties&g ...
- Apache Commons FileUpload 实现文件上传
Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons P ...
- Java一个文件上传工具类
/** * 文件上传 * * @author cary * @since 2012-12-19 下午2:22:12 */ public class FileUploader { static fina ...
- Apache Commons FileUpload实现文件上传
一.Apache Commons-FileUpload简介 Apache Commons是一个专注于可重用Java组件的所有方面的 Apache 项目. Apache Commons项目由三个部分组成 ...
随机推荐
- C# 高性能对象映射
1.之前在使用AutoMapper 框架感觉用着比较不够灵活,而且主要通过表达式树Api 实现对象映射 ,写着比较讨厌,当出现复杂类型和嵌套类型时性能直线下降,甚至不如序列化快. 2.针对AutoMa ...
- 数组问题:a[i][j] 和 a[j][i] 有什么区别?
本文以一个简单的程序开头--数组赋值: int LEN = 10000; int[][] arr = new int[LEN][LEN]; for (int i = 0; i < LEN; i+ ...
- SpringBoot魔法堂:应用热部署实践与原理浅析
前言 后端开发的同学想必每天都在重复经历着修改代码.执行代码编译,等待--重启Tomcat服务,等待--最后测试发现还是有bug,然后上述流程再来一遍(我听不见)
- C#知识结构
C#知识结构 对于一个工作多年的程序员而言,接口.反射.索引器.事件.委托这些耳熟能详的词汇,提起来别说多简单了,但是让老司机坐在那一个人拿起一支笔,把脑海中对C#知识结构进行梳理一下,大抵是写不了多 ...
- Docker(四):Docker安装Redis
查找Redis镜像 镜像仓库 https://hub.docker.com/ 下拉镜像 docker pull redis 查看镜像 docker images 创建Redis容器 运行Redis镜像 ...
- 牛客挑战赛46 B
题目链接: 最小的指数 乍一看还以为是Pollard_rho算法,其实大可不必. 发现\(1<= n <= 1e18\),我们可以将n分为两部分(分块思想降低时间复杂度). 剔除小于等于\ ...
- JAVA基础学习1
一.JAVA是一种具有多种功能的高级语言:1,可以用于开发web页面上的小程序,桌面上运行的应用程序: 2,用于客户端服务器资源通讯的服务器端中间件: 3,还可以用于web服务器. 二.程序设计的5个 ...
- css进阶 05-CSS的一些小知识
05-CSS的一些小知识 #隐藏盒子的几种方式 隐藏盒子,有以下几种方式: (1)方式一: overflow:hidden; //隐藏盒子超出的部分 (2)方式二: display: none; ...
- Java源码赏析(六)Class<T> 类
目的 Class 类是每一个程序员都必须了解的,也是使用反射机制的基础. 这篇文章将Class 类的公共方法大致介绍了一遍(省略了安全.枚举.断言.注解相关代码). 代码 package java.l ...
- 阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis将任务队列push进redis
Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个服务器的处理能力就不能满足我们的需求了(无论是处理速度还是网络请 ...