Maven所需依赖:
<!-- IO包依赖 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- 上传文件依赖 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
前端页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--
注意:上传文件必须需要写enctype="multipart/FORM-data"支持大量数据上传
必须为post类型表示:上传文件大小没有限制
Get类型表示:上传文件大小有限制
--%>
<form method="post" action="upload.do" enctype="multipart/form-data">
用户名:<input type="text" name="UserName"><br>
上传文件:<input type="file" name="textFile"><br>
<input type="submit">|<input type="reset">
</form>
</body>
</html>
配置XML
<!-- 配置请求路径 -->
<servlet>
<servlet-name>FileServlet</servlet-name>
<servlet-class>com.tang.servlet.FileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileServlet</servlet-name>
<url-pattern>/upload.do</url-pattern>
</servlet-mapping>
Servlet:
package com.example.tang;
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 java.io.*;
import java.net.URLDecoder;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//判断上传的文件是不是多部分文件
if (!ServletFileUpload.isMultipartContent(req)) {
resp.getWriter().println(URLDecoder.decode("不是多部分文件!!!", "GB2312"));
//判断如果不是多部分文件直接返回!
return;
}
//创建上传文件的保存路径,建议在WEB-INF目录下用户无法直接访问
String realPath = this.getServletContext().getRealPath("/WEB-INF/upload");//这里是获取/WEB-INF/upload目录存在电脑上的真实路径
System.out.println("存放路径:"+realPath);
File file = new File(realPath);
//判断该文件是否存在如果不存在则创建
if (!file.exists()) {
file.mkdir();
}
//缓存,临时文件(如果上传的大小超过了我们的预期则把他放到临时文件里)
String tmp = this.getServletContext().getRealPath("/WEB-INF/tmp");
System.out.println("临时文件路径:"+tmp);
File file1 = new File(tmp);
if (!file1.exists()) {
file1.mkdir();
}
//上传文件,通常使用流来获取可以通过req.getInputStream()来获取上传的流但十分麻烦,所以
//可以使用Apache文件上传组件fileUpload来实现,他依赖的jar是commons-io
try {
//1.通过工厂设置一个缓冲区,当超过大小限制的时候把他放到缓冲区里
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//处理文件路径或大小限制
diskFileItemFactory.setSizeThreshold(1024 * 1024);//缓冲区大小为1M
diskFileItemFactory.setRepository(file1);
//2.获取ServletFileUpload
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//监听文件上传进度
servletFileUpload.setProgressListener(new ProgressListener() {
@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("总大小:" + pContentLength + ",已上传:" + pBytesRead);
}
});
servletFileUpload.setHeaderEncoding("UTF-8");//处理编码
servletFileUpload.setFileSizeMax(1024L * 1000024 * 10);//设置单个文件的最大值
servletFileUpload.setSizeMax(1024L * 1020004 * 10);//设置总共能上传文件的大小
//3.处理上传文件
//解析请求封装成一个fileItems对象,fileItems需要从ServletFileUpload文件上传对象获取
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
for (FileItem fileItem : fileItems) {
//判断是不是非文件表单是为true
if (fileItem.isFormField()){
String name = fileItem.getFieldName();
String string = fileItem.getString("UTF-8");
System.out.println(name+":"+string);
}else {
//========== 文件处理 ============
String name = fileItem.getName();
//可能存在文件名不合法的
if (name==null||name.trim().equals("")){
continue;//文件名不合法
}
//获取上传文件名
String fileName = name.substring(name.lastIndexOf("/") + 1);
//获取上传文件后缀名
String fileExtName = name.substring(name.lastIndexOf(".") + 1);
//获取随机ID
String uuid = UUID.randomUUID().toString();
// ========== 存放地址 ============
File file2 = new File(realPath+"/"+uuid);
if (!file2.exists()){
file2.mkdir();
}
//========== 文件传输 ============
InputStream inputStream = fileItem.getInputStream();
//创建文件输出流
FileOutputStream fileOutputStream = new FileOutputStream(realPath +"/"+fileName+" "+uuid+"/"+fileName);
//创建一个缓冲区
byte[] bytes = new byte[1024 * 1024];
//判断是否读取完毕
int len=0;
while ((len=inputStream.read(bytes))>0){
fileOutputStream.write(bytes,0,len);
}
//上传成功关闭流
inputStream.close();
fileOutputStream.close();
//上传成功清理临时文件
fileItem.delete();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
方法剥离:
package com.example.tang;
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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;
import java.util.List;
import java.util.UUID;
@WebServlet(name = "Servlet01", value = "/servlet01")
public class Servlet01 extends HttpServlet {
//存放上传文件的路径
private String realPath;
//存放临时文件的对象
private File FileTmp;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//第一步创建文件夹
if (this.newFile(req, resp)) {
//第二步创建工厂通过工厂设置一个缓冲区
DiskFileItemFactory diskFileItemFactory = this.getDiskFileItemFactory();
//第三步获取ServletFileUpload,1.传入工厂 2.设置文件大小最大值 3.设置最大尺寸
ServletFileUpload servletFileUpload = this.getServletFileUpload(diskFileItemFactory, 1024 * 1024 * 10, 1024 * 1024 * 10);
//第四步上传文件
if (this.upload(servletFileUpload, req)) {
resp.getWriter().println("文件上传成功!");
resp.getWriter().println(" File upload succeeded!");
} else {
resp.getWriter().println("文件上传失败!");
resp.getWriter().println("File upload failed!");
}
} else {
resp.getWriter().println("文件夹是否创建失败...");
resp.getWriter().println("Folder creation failed...");
}
}
//创建所需要的文件夹是否创建成功
private Boolean newFile(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//设置编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//判断上传的文件是不是多部分文件
if (!ServletFileUpload.isMultipartContent(req)) {
resp.getWriter().println(URLDecoder.decode("不是多部分文件!!!", "GB2312"));
//判断如果不是多部分文件直接返回!
return false;
}
//创建上传文件的保存路径,建议在WEB-INF目录下用户无法直接访问
realPath = this.getServletContext().getRealPath("/WEB-INF/upload");//这里是获取/WEB-INF/upload目录存在电脑上的真实路径
System.out.println("存放路径:" + realPath);
File file = new File(realPath);
//判断该文件是否存在如果不存在则创建
if (!file.exists()) {
boolean mkdir = file.mkdir();
if (!mkdir) {
return false;
}
}
//缓存,临时文件(如果上传的大小超过了我们的预期则把他放到临时文件里)
String tmp = this.getServletContext().getRealPath("/WEB-INF/tmp");
System.out.println("临时文件路径:" + tmp);
FileTmp = new File(tmp);
if (!FileTmp.exists()) {
boolean mkdir = FileTmp.mkdir();
if (!mkdir) {
return false;
}
}
return true;
}
//1.创建工厂通过工厂设置一个缓冲区,当超过大小限制的时候把他放到缓冲区里
private DiskFileItemFactory getDiskFileItemFactory() {
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold(1024 * 1024);//缓冲区大小为1M
diskFileItemFactory.setRepository(FileTmp);
return diskFileItemFactory;
}
//2.获取ServletFileUpload
private ServletFileUpload getServletFileUpload(DiskFileItemFactory diskFileItemFactory, long setFileSizeMax, long setSizeMax) {
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
servletFileUpload.setHeaderEncoding("UTF-8");//处理编码
servletFileUpload.setFileSizeMax(setFileSizeMax);//设置单个文件的最大值
servletFileUpload.setSizeMax(setSizeMax);//设置总共能上传文件的大小
//监听文件上传进度
servletFileUpload.setProgressListener(new ProgressListener() {
@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("总大小:" + pContentLength + ",已上传:" + pBytesRead);
}
});
return servletFileUpload;
}
//3.处理上传文件
private Boolean upload(ServletFileUpload servletFileUpload, HttpServletRequest req) throws IOException {
List<FileItem> fileItems = null;
try {
fileItems = servletFileUpload.parseRequest(req);
} catch (FileUploadException e) {
e.printStackTrace();
}
for (FileItem fileItem : fileItems) {
//判断是否为普通表单
if (fileItem.isFormField()) {
//========= 普通表单处理 ==========
String name = fileItem.getFieldName();
String string = fileItem.getString("UTF-8");
System.out.println(name + ":" + string);
} else {
//========== 文件处理 ============
String name = fileItem.getName();
//可能存在文件名不合法的
if (name == null || name.trim().equals("")) {
continue;//文件名不合法
}
//获取上传文件名
String fileName = name.substring(name.lastIndexOf("/") + 1);//这里也可以继续获取文件夹类型的后缀名进行约束
//获取随机ID
String uuid = UUID.randomUUID().toString();
// ========== 存放地址 ============
File file2 = new File(realPath + "/" + fileName + " " + uuid);
if (!file2.exists()) {
boolean mkdir = file2.mkdir();
if (!mkdir) {
return false;
}
}
//========== 文件传输 ============
InputStream inputStream = fileItem.getInputStream();
//创建文件输出流
FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName + " " + uuid + "/" + fileName);
//创建一个缓冲区
byte[] bytes = new byte[1024 * 1024];
//判断是否读取完毕
int len = 0;
while ((len = inputStream.read(bytes)) > 0) {
fileOutputStream.write(bytes, 0, len);
}
//上传成功关闭流
inputStream.close();
fileOutputStream.close();
//上传成功清理临时文件
fileItem.delete();
}
}
return true;
}
}