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

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 上传返回进度【最新】 - 小波博客

盘点差零差评的几款手机(1)离春节是越来越近了,很多朋友喜欢在过年换手机,但是更害怕换到智商监测机,今天作者给大家推荐三款口碑接近满分的三款手机,涵盖各大价位三星GalaxyS21Ultra5G(高端)三星G蓝牙耳机圈里的颜值担当有哪些?感谢您的阅读,不考虑价位的话有小鸟TRACKAir苹果Airpodspro和漫步者w3小黄人定制版这三个在耳机圈里的颜值第一梯队。小鸟的TRACKAir系列耳机其实颜值都很高,比较有高颜值的蓝牙耳机推荐吗?高颜值的蓝牙耳机真不少,头戴蓝牙耳机真有一款挺好看的,那就是缤特力BackBeatSense。缤特力BackBeatSense的设计比较的复古,深色的耳罩皮革10级金属外梁调节,都2022苹果首场发布会新款iPhoneSE和MacBookAir将登场时间来到新的一年,苹果在2022年的首场发布会也开始出现很多消息。来自彭博社记者MarkGurman的消息称,苹果今年的第一场发布会会在三月或四月举行,往年的这个时间点都是苹果春季日媒雅虎将对员工居住地不设限坐飞机出勤亦可中新经纬1月13日电据日本共同社消息,雅虎日本公司12日宣布,撤销有关员工居住地的限制,4月起推行可住在全国任何地方的制度。上下班交通方式除以往的电车新干线和巴士等外,还允许坐飞机拒绝假期无聊综合症,这里有700万小时视频任你挑掐指一算,离春节也不过1月有余,转眼间也将迎来元旦小长假。怎样度过假期,追剧打游戏看比赛看电影上网课?随之你会发现假期居家期间如何有仪式感的度过,成为一个值得思考的问题。从手机屏幕如何降低亚马逊FBA物流的送仓成本?很多卖家都会因为仓储成本大而苦恼,尤其是使用亚马逊FBA的卖家,除了平台服务费不便宜之外,还会经常遇到政策调整的问题,最终也是导致成本增加的问题。那么,如何降低FBA发货的成本呢?戴上助听器会有杂音吗?助听器老是嗡嗡响是怎么回事?患者使用助听器后噪音很大,主要可能有三方面原因一可能是佩戴方法不正确,比如说助听器的耳塞没有戴好,就会产生一定啸叫声,可能误以为是噪声,患者应戴好耳塞或者更换耳膜二另一种情况是助听如何有效与助听器佩戴者沟通?要有效地与听力损失患者交谈,需要他们最需要的关心,耐心和体谅,虽然助听器是好帮手,但并不能恢复佩戴者的正常听觉,他们需要的是被人接受即被视作一个正常健全的人,适当的运用一些技巧,加旧iPhone反应太慢?实测发现更改地区可以让iPhone更流畅你有没有发现你的旧iPhone反应越来越慢流畅性大不如前?最近有用户发现可以通过更改手机地区提升运行速度,这疑似与当年电池门降速事件有关。据外媒PhoneArena报道,只要把iP云电脑能用来挖矿吗?可以是可以但是1个小时挖不回来1小时的云电脑钱别多想了想法不错我们先了解下什么是云电脑1)硬件资源池服务器集群中的计算能力内存网络共享存储等形成硬件资源池,既可动态扩展,也可弹性分
魅族两款新机证件照公布M182Q处理器主频2。95GHz(非骁龙870)152。4mm69。2mm8。18mm,162克6。2英寸AMOLED居中单孔曲面屏,分辨率32001400后置64MP16MP8金士顿推出新款U盘DataTravelerMax,读取速度达1GBs金士顿宣布,将推出全新高性能U盘DataTravelerMax。这是一款采用USB3。2Gen2标准接口(TypeC)的高性能闪存盘,最高可提供1000MBs的读取速度,以及900手机ROM是机身内存?这个说法根本就是错的不少文章里介绍手机运行内存叫RAM,机身内存(存储内存)叫ROM,可以说ROM这个说法是以讹传讹,根源上就是错误的。RAM(RandomAccessMemory,随机存取存储器)它30小时续航,铁圈音质,RedmiAirDots3性价比出众真无线蓝牙耳机基本上成为都市白领上下班通勤必备的杀时间利器,这是不少用户日常的使用场景了。那么,对于续航和音质就有了较高的需求,小米的RedmiAirDots3刚好在这两个方面表现同样是机械硬盘,为什么2T比8T读写速度更快?问题出在这里在电脑有大容量存储需求的时候,很多人会考虑加装硬盘。不差钱的会选择固态硬盘,像王校长那样的,花了20万人民币装了5块1。6TIntelOptaneSSD,最快读写速度能达到7。4G好物推荐小熊拆洗电饼铛,加深烤盘双面加热,居家必备早餐机颜值很高的一款煎饼档,操作非常简单,一看就明白怎么使用,就是比普通的煎饼档会大个一些,但是优点在于,煎饼盘是可以拆下来的,非常方便清洗,插线还有地方可以收纳,设计非常人性化。在京东埃安最新充电技术比特斯拉更快恒大汽车亏了48亿充电5分钟,续航200km还记得充电5分钟,通话两小时的手机广告吗?就在昨日,广汽埃安也发布了最新的A480超级充电桩,充电5分钟,即可实现200km的续航,该充电桩最大输出功率达嵌入式开发Linux和Windows的区别尽管每隔几年只发布一次微软Windows的官方版本,但Linux的各种不同版本都在不断更新。在嵌入式开发中,最常用的就是Linux。Linux与Windows的成本与Microso4。6折!新疆电信无线网室分施工项目开标,共12家企业中标近日,新疆电信无线网室分施工项目公布了中标候选人,项目预算为4500万元,划分为12个标段,共12家企业中标。项目概况本项目为20212022年中国电信新疆公司无线网室内分布施工服美探索研发跑酷智能机器人据外媒报道,美陆军正与加州大学合作解析松鼠奔跑跳跃能力背后的奥秘,希望从中获得研发跑酷智能机器人的灵感。报道称,加州大学研究人员在一篇论文中针对松鼠如何决定跑跳如何评估自身能否完成有没有高性价比的厨房电器好物推荐?如果你还在打算使用老式的厨房家具和电器,一定不要错过今天的文章,厨房家装一定要多看看新产品,它会更加人性化,更有设计感,大幅度提升厨房使用的幸福指数。来看看今天有哪些高性价比的厨电