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)硬件资源池服务器集群中的计算能力内存网络共享存储等形成硬件资源池,既可动态扩展,也可弹性分