范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBoot上传文件返回进度

  导入的包    commons-fileupload    commons-fileupload    1.4   // 根据自己需要     org.projectlombok    lombok    true 进度返回类**  * @author Linux"s user: FB  * device: Windows 11  * create time: 2022/3/2  * remarks: []  */ @Data public class Progress implements Cloneable {      private long bytesRead;     private long contentLength;     private long items;      private static final Progress progress = new Progress();      public static Progress getInstance() {         return progress.clone();     }      @Override     public Progress clone() {         try {             return (Progress) super.clone();         } catch (CloneNotSupportedException e) {             throw new AssertionError();         }     } }文件上传监听器@Component public class FileUploadListener implements ProgressListener {      private final Map map = new ConcurrentHashMap<>();      private final HttpServletRequest request;      public FileUploadListener(HttpServletRequest request) {         this.request = request;     }      /**      * @param bytesRead 当前上传大小      * @param contentLength 总大小      * @param items 当前上传个数      */     @Override     public void update(long bytesRead, long contentLength, int items) {         Progress progress = Progress.getInstance();         progress.setBytesRead(bytesRead);         progress.setContentLength(contentLength);         progress.setItems(items);         // 可替换成 redis / session         map.put(request.getHeader("file"), progress);     }      public Progress getMap(String header) {         return map.get(header);     } }  文件上传解析器@Component public class CustomMultipartResolver extends CommonsMultipartResolver {      private final FileUploadListener fileUploadListener;      public CustomMultipartResolver(FileUploadListener fileUploadListener) {         this.fileUploadListener = fileUploadListener;     }      @Override     protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {         String encoding = determineEncoding(request);         FileUpload fileUpload = prepareFileUpload(encoding);         // 设置上传监听器         fileUpload.setProgressListener(fileUploadListener);         try {             List fileItems = ((ServletFileUpload)fileUpload).parseRequest(request);             return this.parseFileItems(fileItems, encoding);         } catch (FileUploadBase.SizeLimitExceededException var5) {             throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), var5);         } catch (FileUploadBase.FileSizeLimitExceededException var6) {             throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), var6);         } catch (FileUploadException var7) {             throw new MultipartException("Failed to parse multipart servlet request", var7);         }     } } Controller 接口@RestController public class UploadController {      private final UploadService uploadService;      public UploadController(UploadService uploadService) {         this.uploadService = uploadService;     }      @PostMapping("/upload")     public R upload (MultipartFile[] file) {         uploadService.upload(file);         return R.ok().message("上传成功");     }      @GetMapping("/progress")     public R progress (HttpServletRequest request) {         String file = request.getHeader("file");         if (StringUtils.isNullOrEmpty(file)) return R.error().message("需要 header: [file=xxx] 标识");          return R.ok().message(uploadService.getUploadDone(file) ? "上传完成" : "上传中...").data(uploadService.getProgressStyle(file));     } } Service 实现类@Service public class UploadServiceImpl implements UploadService {      private final StringBuilder stringBuilder = new StringBuilder();      private final Map map = new HashMap<>(4);      // 构造注入上传监听     private final FileUploadListener listener;      public UploadServiceImpl(FileUploadListener listener) {         this.listener = listener;     }      /**      * 返回进度参数信息      *         "progress": "[##########] 100%",      *         "item": 3,      *         "percent": 100,      *         "status": "over"      * @param header 文件标识      * @return Map      */     // 进度 Map     @Override     public Map getProgressStyle (String header) {         Progress progress = listener.getMap(header);         if (progress == null) throw new CustomException("未上传文件");          long read = progress.getBytesRead();         long percent = 0;         if (read != 0) percent = (read * 100) / progress.getContentLength();         map.put("percent", percent);         map.put("status", percent == 100 ? "over" : "active");         map.put("progress", getStyleOfCount(percent));         map.put("item", progress.getItems());         return map;     }      /**      * 判断文件是否上传文成      * @param header 文件标识      * @return true / false      */     @Override     public boolean getUploadDone(String header) {         Progress progress = listener.getMap(header);         if (progress == null) throw new CustomException("未上传文件");          return progress.getBytesRead() == progress.getContentLength();     }      /**      * 文件保存操作      * 这里做存储文件等其他操作操作      * 这里也需要返回进度的话,上面的进度需要 / 2,各记 50%      * @param file 文件      */     @Override     public void upload(MultipartFile[] file) {         Arrays.asList(file).forEach(f -> {             if (f.isEmpty()) {                 throw new CustomException("文件为空");             } else {                 System.out.println("文件名:" + f.getOriginalFilename());                 System.out.println("文件大小:" + f.getSize());                 System.out.println("文件类型:" + f.getContentType());             }         });     }      /**      * 进度样式      * @param percent 进度百分比      * @return [###       ] 30%      */     private String getStyleOfCount (long percent) {         stringBuilder.setLength(0);         stringBuilder.append("[");         for (int i = 0; i < percent / 10; i++) {             stringBuilder.append("#");         }         for (int i = 0; i < 10 - (percent / 10); i++) {             stringBuilder.append(" ");         }         stringBuilder.append("] ").append(percent).append("%");         return stringBuilder.toString();     } } 效果
  上传准备
  点击上传后,file 是文件的唯一标识,上传时也需要传入
  然后看效果(item 是文件个数)
  项目地址:
  Spring Boot 上传返回进度【最新】 - 小波博客

时光很暖,脚步很慢清晨,秋雨潇潇,寒风阵阵,幸福小镇大街小巷只有稀稀疏疏过路的人。虽然已过六点,太阳却迟迟没有露出光亮,似乎被什么力量遏制,无法脱身。滴答滴答,几颗黄豆大的雨点突然从阴霾的空中落下,群狼逐鹿,加冕荣耀!狼人杀英雄联赛总决赛明日开战逻辑对决,破晓加冕!2022狼人杀英雄联赛WPL总决赛高燃来袭!12支来自主播精英赛线上淘汰赛人气复活赛等多个晋级通道,经历了层层选拔的最强门派集结,正式展开终极对决!10月28日不要嘲笑下山的神,但是下山的神能不能别逗我们这些凡人笑世间宇宙万物有盛有衰,任何事物不可能永恒强盛,否则这世界就太无趣了,毕竟更迭才是永恒的,而强盛只是暂时的,大部分人都该接受自己有一天会衰老会死亡!西罗作为曾经有些逆天的神,创造了大孤独而自由我想自由的人大概都是孤独的吧。可能是因为我的浅薄让我这么认为,可能我以后会改变想法,但这一刻我确实是这么认为的。风是自由的,但若吹入小巷,与青瓦便有了交集,这一刻的风纠缠了烟火气变十日谈乌桕微丹菊渐开满大街的低头族,能有几个认得乌桕树并懂得欣赏它的美呢?乌桕,是山野里最美的树。几场秋风刮过,天蓝得透亮,三棵乌桕站在溪水边,和流云一起把影子投进深潭。人在青石古桥上,一腔心思被簌簌真正的母爱应该是有温度且有分寸的曾经读到一篇关于母亲的文章,里面这样写母亲是暖暖的人,像个太阳,她走到哪里,哪里就是亮堂堂的,暖和和的,空气里的温度都要上升几度。我想,最好的母亲,该是如此吧。真正的母爱应该是有温两个人的烟花,一个人的等待李氏呓语20131129一有一种沉淀的感觉叫做寂寞2006年我被公司从家门口调到了外地,即使满心不愿意,也不得不去。唐山是一个北方的重工业城市,人们生活节奏还是习惯日出而作日落而息聪明人的个人成长读书笔记我们获得成长的一个最主要途径就是持续发现更多关于我们自己关于外部世界的现实真相。无论你过着什么样的生活,都必然会从这种生活中获得某些经验。但是,如果你能够清醒自主地探求真相远离虚伪中国红温暖欧洲中国挽救欧洲?因众所周知的原因,欧洲面临巨大的能源危机,这让本就寒冷的冬天雪上加霜。由于天然气和电费太高,很多欧洲人转而使用传统的煤炭进行供暖,有的甚至在砍树劈柴为冬天做准备。然而缺少了俄罗斯的夜雨丨胡德在观音阁老茶馆饮尽时光(组诗)在观音阁老茶馆饮尽时光(组诗)胡德在观音阁老茶馆饮尽时光一溜青石板铺叙而成的老街拼接着穿抖木瓦房的孤独彭镇,用倒流的时光突兀成一种网红观音阁老茶馆流动的茶客品饮着百年的刀光剑影杨柳凝望岁月随遇而安凝望岁月随遇而安文雪映梅花丹桂飘香,秋高气爽醉了秋日好时光斑斓且听秋日风吟秋日私语亦无言才是最高的境界人世繁华,四季轮回人生也有四季,走过春夏秋冬酸甜苦辣随缘自在学会放下放下过往冷
装配式酒店民宿会是未来投资热点吗?疫情因素叠加之下,传统酒店面临着更多不确定性的营业周期和人群流动条件,装配式酒店民宿可以帮助酒店业主及运营者大幅缩短装修翻新时间,提供趋近于0甲醛释放的优质装配式客房正在成为酒店3研究认为核电未来可期来源科学网研究人员对铀发电中的资源使用进行了生命周期评估。图片来源日本立命馆大学在这个不断变化的世界,迅速增长的人口加上城市化和工业化导致能源需求日益增加。当前的挑战在于,在满足这投资圈刷屏,10万!半夏投资李蓓官宣不再公开发文,还顺便征友至少985毕业,身高178cm以上每经记者王砚丹每经编辑彭水萍半夏投资公众号上,一篇写给所有喜欢李蓓的人火了。6月26日早间1032分,李蓓通过这篇文章,官宣以后不再公开发文章了,大部分时间,也不会接受公开采访了。周华健混血儿子晒近况,外出扎营裸上身似野人,胡子拉碴比爸还老饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!6月23日,周华健的儿子周厚安晒出了自己的近照,当天他参加了一个户外野营的活动,画面中的他皮肤黝黑,赤裸着上半身,看上去苏炳添因发烧取消赛季首秀新华社北京6月26日电中国飞人苏炳添25日在社交媒体个人账号上称,自己因发烧取消参加在美国举行的比赛。这意味着他2022赛季的首秀推迟,他同时晒出了自己新冠抗原检测阴性结果。苏炳添但愿世上无疾苦,宁可架上药生尘我是赵瑞珍,北京中医药大学第三附属医院治未病中心主任博士后主任医师,擅长失眠头晕肥胖症头痛焦虑抑郁乏力心悸耳鸣脑鸣高血压更年期综合症等相关疾病的诊治。长期从事中医针灸临床教学科研工为何中国足球老不行?看看这建成仅两年即将被拆除的13块球场吧酷热的盛夏,之于中国足球,却是永远的凉夏,甚至严冬。尤其在和近邻的对比中,总让人胸闷气短,满心冰凉。刚结束的202122赛季英超联赛,攻入23球的孙兴慜,成为欧洲五大联赛史上首位夺美版知乎提问到中国旅游后你对中国的看法有什么改变吗?中国由于经济发展迅速,人们的生活水平也已经有了大幅提高,在以前很多外国人眼中的中国是贫穷落后的,直到现在很多外国人仍然对我们国家抱有一定的偏见,之所以会有这种现象的发生,是因为很多踏空新能源锅在特斯拉丨檀FOF新能源汽车在国内资本市场热火朝天,比亚迪已经突破万亿市值,股价更是创下历史新高。这一次,美国的特斯拉股价却持续低迷,资本市场表现平平淡淡。比亚迪向上,特斯拉向下或许是我们弯道超车的特斯拉裁员波及中国区,赔偿或为N3,部分生产岗暂停招聘特斯拉的裁员潮已开始波及中国市场。据新浪科技报道,特斯拉中国开启了约10比例的裁员计划。报道并援引知情人士称,这是特斯拉全球裁员计划的组成部分。同时,近日,有自称特斯拉员工的用户在花32。88万买辆特斯拉Model,开了三万公里,车主说出优缺点随着咱百姓日子过得好,手里也都有了些存款,买车也从之前的脸面第一变成了实用第一,毕竟现在的人手里多少都有钱,除了一些生意人需要用车来彰显实力外,大部分人都会选择经济好开的品牌,而电