1、配置文件
#此处是为了解决冲突
spring.http.multipart.enabled=false
2、下载进度监听器
package com.sample.common.upload;
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
@Component
public class FileUploadProgressListener implements ProgressListener {
private HttpSession session;
public void setSession(HttpSession session) {
this.session = session;
session.setAttribute("upload_percent", 0);
}
@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
int percent = (int) (pBytesRead * 100.0 / pContentLength);
session.setAttribute("upload_percent", percent);
}
}
3、自定义解析器
package com.sample.common.upload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
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.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);
fileUpload.setProgressListener(listener);
listener.setSession(request.getSession());
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
}catch (FileUploadException ex) {
throw new MultipartException("Failed to parse multipart servlet request", ex);
}
}
}
4、配置解析器
package com.sample.common.config;
import com.sample.common.upload.CustomMultipartResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
@Configuration
public class BeanConfig {
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver()
{
return new CustomMultipartResolver();
}
}
5、控制器
package com.sample.modules.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class UploadController {
@RequestMapping(value = "/uploadPage")
public String uploadPage(){
return "uploadPage";
}
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public String upload(@RequestParam(value = "file") MultipartFile file){
System.out.println(file.getName());
return "success";
}
@RequestMapping(value = "/uploadStatus")
@ResponseBody
public Integer uploadStatus(HttpServletRequest request){
HttpSession session = request.getSession();
Object percent = session.getAttribute("upload_percent");
return null != percent ? (Integer) percent : 0;
}
}
6、测试页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>测试</title>
</head>
<body>
<form id="form" action="/upload" method="POST" enctype="multipart/form-data" onsubmit="return upload();">
<input type="file" name="file"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery.form/4.2.2/jquery.form.min.js"></script>
<script>
function upload() {
$("#form").ajaxSubmit(function(message) {
});
// 500ms 打印一次当前的上传进度
setInterval(function () {
$.ajax({
type:"get",
dataType: 'json',
url:"/uploadStatus",
success: function(result){
console.log(result)
}
});
}, 500);
return false;
}
</script>
</html>