导入的包dependencygroupIdcommonsfileuploadgroupIdcommonsfileuploadartifactIdversion1。4versiondependency根据自己需要dependencygroupIdorg。projectlombokgroupIdlombokartifactIdoptionaltrueoptionaldependency进度返回类authorLinuxsuser:FBdevice:Windows11createtime:202232remarks:〔〕DatapublicclassProgressimplementsCloneable{privatelongbytesRprivatelongcontentLprivatestaticfinalProgressprogressnewProgress();publicstaticProgressgetInstance(){returnprogress。clone();}OverridepublicProgressclone(){try{return(Progress)super。clone();}catch(CloneNotSupportedExceptione){thrownewAssertionError();}}}文件上传监听器ComponentpublicclassFileUploadListenerimplementsProgressListener{privatefinalMapString,ProgressmapnewConcurrentHashMap();privatefinalHttpServletRpublicFileUploadListener(HttpServletRequestrequest){this。}parambytesRead当前上传大小paramcontentLength总大小paramitems当前上传个数Overridepublicvoidupdate(longbytesRead,longcontentLength,intitems){ProgressprogressProgress。getInstance();progress。setBytesRead(bytesRead);progress。setContentLength(contentLength);progress。setItems(items);可替换成redissessionmap。put(request。getHeader(file),progress);}publicProgressgetMap(Stringheader){returnmap。get(header);}}文件上传解析器ComponentpublicclassCustomMultipartResolverextendsCommonsMultipartResolver{privatefinalFileUploadListenerfileUploadLpublicCustomMultipartResolver(FileUploadListenerfileUploadListener){this。fileUploadListenerfileUploadL}OverrideprotectedMultipartParsingResultparseRequest(HttpServletRequestrequest)throwsMultipartException{StringencodingdetermineEncoding(request);FileUploadfileUploadprepareFileUpload(encoding);设置上传监听器fileUpload。setProgressListener(fileUploadListener);try{ListFileItemfileItems((ServletFileUpload)fileUpload)。parseRequest(request);returnthis。parseFileItems(fileItems,encoding);}catch(FileUploadBase。SizeLimitExceededExceptionvar5){thrownewMaxUploadSizeExceededException(fileUpload。getSizeMax(),var5);}catch(FileUploadBase。FileSizeLimitExceededExceptionvar6){thrownewMaxUploadSizeExceededException(fileUpload。getFileSizeMax(),var6);}catch(FileUploadExceptionvar7){thrownewMultipartException(Failedtoparsemultipartservletrequest,var7);}}}Controller接口RestControllerpublicclassUploadController{privatefinalUploadServiceuploadSpublicUploadController(UploadServiceuploadService){this。uploadServiceuploadS}PostMapping(upload)publicRupload(MultipartFile〔〕file){uploadService。upload(file);returnR。ok()。message(上传成功);}GetMapping(progress)publicRprogress(HttpServletRequestrequest){Stringfilerequest。getHeader(file);if(StringUtils。isNullOrEmpty(file))returnR。error()。message(需要header:〔filexxx〕标识);returnR。ok()。message(uploadService。getUploadDone(file)?上传完成:上传中。。。)。data(uploadService。getProgressStyle(file));}}Service实现类ServicepublicclassUploadServiceImplimplementsUploadService{privatefinalStringBuilderstringBuildernewStringBuilder();privatefinalMapString,ObjectmapnewHashMap(4);构造注入上传监听privatefinalFileUploadLpublicUploadServiceImpl(FileUploadListenerlistener){this。}返回进度参数信息progress:〔〕100,item:3,percent:100,status:overparamheader文件标识returnMapString,Object进度MapOverridepublicMapString,ObjectgetProgressStyle(Stringheader){Progressprogresslistener。getMap(header);if(progressnull)thrownewCustomException(未上传文件);longreadprogress。getBytesRead();longpercent0;if(read!0)percent(read100)progress。getContentLength();map。put(percent,percent);map。put(status,percent100?over:active);map。put(progress,getStyleOfCount(percent));map。put(item,progress。getItems());}判断文件是否上传文成paramheader文件标识returntruefalseOverridepublicbooleangetUploadDone(Stringheader){Progressprogresslistener。getMap(header);if(progressnull)thrownewCustomException(未上传文件);returnprogress。getBytesRead()progress。getContentLength();}文件保存操作这里做存储文件等其他操作操作这里也需要返回进度的话,上面的进度需要2,各记50paramfile文件Overridepublicvoidupload(MultipartFile〔〕file){Arrays。asList(file)。forEach(f{if(f。isEmpty()){thrownewCustomException(文件为空);}else{System。out。println(文件名:f。getOriginalFilename());System。out。println(文件大小:f。getSize());System。out。println(文件类型:f。getContentType());}});}进度样式parampercent进度百分比return〔〕30privateStringgetStyleOfCount(longpercent){stringBuilder。setLength(0);stringBuilder。append(〔);for(inti0;ipercent10;i){stringBuilder。append();}for(inti0;i10(percent10);i){stringBuilder。append();}stringBuilder。append(〕)。append(percent)。append();returnstringBuilder。toString();}}效果 上传准备 点击上传后,file是文件的唯一标识,上传时也需要传入 然后看效果(item是文件个数) 项目地址: SpringBoot上传返回进度【最新】小波博客