天天看點

SpringBoot MultipartFile 監控上傳檔案進度

# 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();
    }
           

繼續閱讀