# SpringBoot MultipartFile監控上傳檔案進度>引用塊内容
在一次項目中需要監控檔案上傳的進度。将進度監控到之後計算百分比,存入session中session需要配置實時生效,不然監控不到進度,此進度在内網環境表現很好,公網環境因為前端body較大,接收時間較長,前端會有一段時間的0% ,是以寫了一篇分塊上傳的文檔,需要的可以留言找我要
`session實時生效`
spring
session:
store-type: redis
redis:
flush-mode: immediate
package com.zichan360.common.Progress;
import com.zichan360.common.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
/**
* @ClassName: FileUploadProgressListener
* @ProjectName CollectorClub
* @Author zhaohp
* @Date 2018/9/111:10
* @Description:
*/
@Slf4j
@Component
public class FileUploadProgressListener implements ProgressListener {
private HttpSession session;
public void setSession(HttpSession session) {
this.session = session;
log.info("upload_percent 0--------------------------------------" + DateUtil.getTime());
session.setAttribute("upload_percent", );
}
@Override
public void update(long bytesRead, long contentLength, int items) {
int percent = (int) (bytesRead * / contentLength);
session.setAttribute("upload_percent", percent);
log.info(percent + "--------------------------------------" + DateUtil.getTime());
}
}
package com.zichan360.common.Progress;
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;
/*
*
* @ClassName: CustomMultipartResolver
* @ProjectName CollectorClub
* @Author zhaohp
* @Date 2018/9/111:11
* @Description:
*/
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.setFileSizeMax( * * );// 單個檔案最大500M
//fileUpload.setSizeMax( * * );// 一次送出總檔案最大500M
//向檔案上傳進度監視器設置session用於存儲上傳進度
listener.setSession(request.getSession());
//將檔案上傳進度監視器加入到fileUpload中
fileUpload.setProgressListener(listener);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
} catch (FileUploadException e) {
e.printStackTrace();
}
return null;
}
}
package com.zichan360;
import com.zichan360.common.Progress.CustomMultipartResolver;
import com.zichan360.config.datasources.DynamicDataSourceConfig;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,MultipartAutoConfiguration.class})
@EnableWebMvc
@ServletComponentScan
@Import({DynamicDataSourceConfig.class})
public class SpringbootApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringbootApplication.class);
/*
* Banner.Mode.OFF:關閉;
* Banner.Mode.CONSOLE:控制台輸出,預設方式;
* Banner.Mode.LOG:日志輸出方式;
*/
application.setBannerMode(Banner.Mode.CONSOLE);
//啟動項目
application.run(args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringbootApplication.class);
}
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
return new CustomMultipartResolver();
}
}
/**
* 擷取實時長傳進度
*
* @param request
* @return int percent
*/
@GetMapping("getPercent")
public Result<Integer> getUploadPercent(HttpServletRequest request) {
HttpSession session = request.getSession();
int percent = session.getAttribute("upload_percent") == null ? : (int) session.getAttribute("upload_percent");
return ResultUtil.success(percent);
}
/**
* 重置上傳進度 前端調用進度之前調用此接口
*
* @param request
* @return void
*/
@PostMapping("resetPercent")
public Result resetPercent(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("upload_percent", );
return ResultUtil.success();
}