-
项目中需要对半结构化数据源(ftp,sftp,hdfs等)根据从数据库读取的配置信息进行创建相应的连接对象。可以使用hutool项目中extra包下面的ftp包和ssh包。这两个包囊括的相应方法基本上能够满足基本需求,当然如果满足不了,可以给作者提或者可以在dev5分支上贡献自己的代码。
-
hutool项目封装了很多的实用的方法,比如还有二维码、图片验证码,excel的相关操作,加解密等各种工具类,在日常的工作中使用它真的可以事半功倍。
-
FtpTemplate
import cn.hutool.extra.ftp.Ftp;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
/**
* ftp 连接对象
*
* @author niulibing
*/
@Data
@AllArgsConstructor
public class FtpTemplate implements Serializable {
/**
* ftp客户端
*/
private Ftp ftpClient;
}
- SshTemplate
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.Session;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
/**
* sftp template
*
* @author niulibing
* @date 2020-06-29
*/
@Data
@AllArgsConstructor
public class SshTemplate implements Serializable {
/**
* sftp客户端
*/
private ChannelSftp sftp;
private Session session;
public SshTemplate() {
}
/**
* 构造sftp
*
* @param sftp sftp
*/
public SshTemplate(ChannelSftp sftp) {
this.sftp = sftp;
}
/**
* 构造session
*
* @param session session
*/
public SshTemplate(Session session) {
this.session = session;
}
}
- SemiStructuredDataSourceImpl
import cn.hutool.extra.ftp.Ftp;
import cn.hutool.extra.ssh.JschUtil;
import com.jcraft.jsch.Session;
import com.kun.framework.crypto.cipher.DesCipher;
import com.kun.res.base.ResBaseInfo;
import com.kun.res.service.context.datasource.SemiStructuredDataSourceService;
import com.kun.res.template.FtpTemplate;
import com.kun.res.template.SshTemplate;
import com.kun.res.utils.DataSourceUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
/**
* 半结构化数据源实现类
*
* @author niulibing
* @date 2020-06-29
*/
@Service
@Slf4j
public class SemiStructuredDataSourceImpl implements SemiStructuredDataSourceService {
/**
* 数据源工具类
*/
@Autowired
private DataSourceUtil dataSourceUtil;
/**
* FTP
*/
@Autowired
private Ftp ftp;
/**
* 获取ftp连接对象
*
* @param instanceId 数据源实例id
* @return FtpTemplate
*/
@Override
public FtpTemplate getFtpTemplate(String instanceId) throws NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException {
ResBaseInfo baseInfo = dataSourceUtil.encapsulationParameters(instanceId);
//获取连接
return new FtpTemplate(ftp.init(baseInfo.getHost(), Integer.parseInt(baseInfo.getPort()), baseInfo.getUserName(), DesCipher.decrypt(baseInfo.getUserPwd())));
}
/**
* 获取sftp连接对象
*
* @param instanceId 数据源实例id
* @return SftpTemplate
*/
@Override
public SshTemplate getSftpTemplate(String instanceId) throws NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException {
ResBaseInfo baseInfo = dataSourceUtil.encapsulationParameters(instanceId);
Session session = JschUtil.getSession(baseInfo.getHost(), Integer.parseInt(baseInfo.getPort()), baseInfo.getUserName(), DesCipher.decrypt(baseInfo.getUserPwd()));
return new SshTemplate(JschUtil.openSftp(session, 5000), session);
}
其实真正获取ftp和sftp对象的就一句代码,开发确实是方便了很多。具体的上传下载通过获取ftp和sftp对象调用即可。
Ftp ft = ftp.init(baseInfo.getHost(), Integer.parseInt(baseInfo.getPort()), baseInfo.getUserName(), DesCipher.decrypt(baseInfo.getUserPwd()));
Session session = JschUtil.getSession(baseInfo.getHost(), Integer.parseInt(baseInfo.getPort()), baseInfo.getUserName(), DesCipher.decrypt(baseInfo.getUserPwd()));
ChannelSftp sftp = JschUtil.openSftp(session, 5000);
开源项目hutool github地址:
https://github.com/looly/hutool
文档地址:
https://www.hutool.cn/docs/#/