Sftp下载在页面上显示进度

it2023-07-22  72

业务需求是这样的,从一个服务器下载文件到本地,但有时候文件很大,需要查看下载的进度。

这里只提供一下思路,有问题的可以留言交流。

1.项目用的是ssm架构(springboot+spring+mybatis)

2.sftp用到的是jsch这个包

3.下载的时候用ajax来请求,因为ajax的success回调函数只有在请求结束的时候才能调用,所以无法实时监控下载的情况。

4.想到通过ajax的beforeSend这个回调函数来增加一个监控线程,设定一个setInterval,每隔1秒请求后台来获取下载的进度,主要代码如下:

beforeSend: function(data) { setInterval(function(){ //TODO 请求后台,获取下载的进度情况 },1000); },

5.后台controller层增加一个请求接口,来获取下载的进度情况

@RequestMapping(value = "/checkProgress") @ResponseBody public String checkProgress() { //TODO 获取下载的进度信息 }

6.jsch本身提供了一个SftpProgressMonitor接口来监听下载的进度信息,所以写一个类来实现这个接口。

public class Monitor implements SftpProgressMonitor { @Override public boolean count(long arg0) { // TODO Auto-generated method stub return false; } @Override public void end() { // TODO Auto-generated method stub } @Override public void init(int arg0, String arg1, String arg2, long arg3) { // TODO Auto-generated method stub } }

7.关键一点是如何把监听类获取到的进度信息传给controller层的checkProgress接口呢?我想到了通过缓存的方法,先把进度信息放入到缓存,然后checkProgress从缓存中获取。下面是一个网上找到的缓存类,可以用一下。

import java.util.HashMap; import java.util.Map; public class CacheUtil { private static CacheUtil cacheUtil; private static Map<String, Object> cacheMap; private CacheUtil() { cacheMap = new HashMap<String, Object>(); } public static CacheUtil getInstance() { if (cacheUtil == null) { cacheUtil = new CacheUtil(); } return cacheUtil; } /** * 添加缓存 * * @param key * @param obj */ public void addCacheData(String key, Object obj) { cacheMap.put(key, obj); } /** * 取出缓存 * * @param key * @return */ public Object getCacheData(String key) { return cacheMap.get(key); } /** * 清楚缓存 * * @param key */ public void removeCacheData(String key) { cacheMap.remove(key); } }

 

最新回复(0)