1.新建springBoot项目并添加依赖
<!-- fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2.定义简易返回结果
package com.hyb.fileiupload.comon;
import javax.xml.crypto.Data;
public class JsonResult<T> {
private T Data;
public JsonResult(T data) {
Data = data;
}
public T getData() {
return Data;
}
public void setData(T data) {
Data = data;
}
}
3. 添加Fileconfig
package com.hyb.fileiupload.config;
import com.hyb.fileiupload.listener.CustomMultipartResolver;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableAutoConfiguration
public class FileConfig implements WebMvcConfigurer {
/**
* 指定自定义解析器
* 将 multipartResolver 指向我们刚刚创建好的继承 CustomMultipartResolver 类的 自定义文件上传处理类
*
* @return
*/
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
return new CustomMultipartResolver();
}
/**
* 图片保存路径,自动从yml文件中获取数据
* 示例: D:/upload/
*/
@Value("${file.path}")
private String fileSavePath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
* 配置资源映射
* 意思是:如果访问的资源路径是以“/images/”开头的,
* 就给我映射到本机的“E:/images/”这个文件夹内,去找你要的资源
* 注意:E:/images/ 后面的 “/”一定要带上
*/
registry.addResourceHandler("/upload/**")
.addResourceLocations("file:"+fileSavePath);
}
}
4.进度条返回实体类
package com.hyb.fileiupload.entity;
import lombok.Data;
import lombok.ToString;
import org.springframework.stereotype.Component;
@Component
@Data
@ToString
public class ProgressEntity {
// 读取的文件的比特数
private long pBytesRead = 0L;
// 文件的总大小
private long pContentLength = 0L;
// 目前正在读取第几个文件
private int pItems;
private long startTime = System.currentTimeMillis();
}
5. 设置监听类
package com.hyb.fileiupload.listener;
import com.hyb.fileiupload.entity.ProgressEntity;
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
/**
* 文件上传进度
*/
@Component
public class FileUploadProgressListener implements ProgressListener {
private HttpSession httpSession;
public void setHttpSession(HttpSession httpSession) {
this.httpSession = httpSession;
ProgressEntity status = new ProgressEntity();
//默认进度为0
httpSession.setAttribute("status", status);
}
/**
* pBytesRead 到目前为止读取文件的比特数
* pContentLength 文件总大小
* pItems 目前正在读取第几个文件
*/
@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
ProgressEntity status = (ProgressEntity) httpSession.getAttribute("status");
status.setPBytesRead(pBytesRead);
status.setPContentLength(pContentLength);
status.setPItems(pItems);
// System.out.println("UploadProgressListener update ProgressEntity: " + status.toString());
}
}
7. 文件解析器
package com.hyb.fileiupload.listener;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
public class CustomMultipartResolver extends CommonsMultipartResolver {
@Autowired
private FileUploadProgressListener listener;
@Override
protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
String encoding = determineEncoding(request);
FileUpload fileUpload = prepareFileUpload(encoding);
// 文件上传进度监听器设置session用于存储上传进度
listener.setHttpSession(request.getSession());
// 将文件上传进度监听器加入到 fileUpload 中
fileUpload.setProgressListener(listener);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
} catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
} catch (FileUploadBase.FileSizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);
} catch (FileUploadException ex) {
throw new MultipartException("Failed to parse multipart servlet request", ex);
}
}
}
8. controller层文件上传接口
package com.hyb.fileiupload.controller;
import com.hyb.fileiupload.comon.JsonResult;
import com.hyb.fileiupload.entity.ProgressEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import sun.plugin2.util.SystemUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;
@RestController
@Slf4j
public class FileUploadController {
/**
* 配置的上传路径
*/
@Value("${file.path}")
private String filePath;
/**
* 普通文件上传
*
* @param files
* @param request
* @return
*/
@PostMapping("/uploadFile")
public JsonResult uploadFile(@RequestParam("files") List<CommonsMultipartFile> files, HttpServletRequest request) {
StringBuffer buffer = new StringBuffer();
for (CommonsMultipartFile file : files) {
//获取原文件名称和后缀
String originalFilename = file.getOriginalFilename();
// 获取文件后缀名
String fil_extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
String path = "milli" + originalFilename;
try {
File file1 = new File(filePath + path);
boolean mkdirs = file1.mkdirs();
log.info("文件夹{}创建{}", file1.getAbsolutePath(), mkdirs ? "成功" : "失败");
file.transferTo(file1);
log.info("{} 上传成功!", originalFilename);
buffer.append(path);
} catch (IOException e) {
e.printStackTrace();
log.error("{} 上传失败!", originalFilename);
continue;
}
}
return new JsonResult(buffer);
}
/**
* 获取上传进度
*
* @param request
* @return
*/
@GetMapping(value = "/uploadStatus")
public JsonResult uploadStatus(HttpServletRequest request) {
HttpSession session = request.getSession();
ProgressEntity percent = (ProgressEntity) session.getAttribute("status");
return new JsonResult(percent);
}
/**
* 删除文件
*
* @param url http://127.0.0.1:8080/upload/2020/7/19/1595158527436video.mp4
* @return
*/
@GetMapping(value = "/deleteFile")
public JsonResult deleteFile(String url) {
//截取第四个“/”后面的字符串
int i1 = url.indexOf('/');
int i2 = url.indexOf('/', i1 + 1);
int i3 = url.indexOf('/', i2 + 1);
int i4 = url.indexOf("/", i3 + 1);
String substring = url.substring(i4 + 1, url.length());
String relPath = filePath + substring;
File file = new File(relPath);
if (file.isFile() && file.exists()) {
boolean delete = file.delete();
if (!delete) {
log.error("{} 删除失败!", substring);
//throw new MyException(ErrorEnum.FILE_DELETE_EXCEPTION);
} else {
log.info("{} 删除成功!", substring);
}
} else {
log.error("{} 文件不存在!", substring);
//throw new MyException(ErrorEnum.FILE_NOT_EXISTS);
}
return new JsonResult("删除成功");
}
}
9. application简单配置
# 应用名称
spring.application.name=fileiupload
# 应用服务 WEB 访问端口
server.port=8080
#使用重写后文件上传解析,以添加上传进度监听功能
spring.http.multipart.enabled=false
#设置一次请求中允许上传的文件大小
spring.http.multipart.max-request-size=1024MB
#设置允许上传的文件的大小
spring.http.multipart.max-file-size=1024MB
#文件上传根目录
file.path: /Users/tianpuyang/uploadPath/file/
10: postman 测试
上传:localhost:8080/uploadFile
获取文件上传信息: localhost:8080/uploadStatus