java 连接sftp上传,下载文件
程序员文章站
2022-03-26 21:21:58
package com.example.demo.util;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.jcraft.jsch.*;import com.mongodb.*;import com.mzlion.core.io.IOUtils;import lombok.extern.slf4j.Slf4j;import java.io.*;import java.u....
package com.example.demo.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jcraft.jsch.*;
import com.mongodb.*;
import com.mzlion.core.io.IOUtils;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.util.*;
/**
* @Author : ZhangPeiPei
* @Description : TODO
* @Date : 2020/12/9 15:01
* @Versions : 1.0
**/
@Slf4j
public class SFTPUtil {
private ChannelSftp sftp;
private Session session;
/** SFTP 登录用户名*/
private String username;
/** SFTP 登录密码*/
private String password;
/** 私钥 */
private String privateKey;
/** SFTP 服务器地址IP地址*/
private String host;
/** SFTP 端口*/
private int port;
/**
* 构造基于密码认证的sftp对象
*/
public SFTPUtil(String username, String password, String host, int port) {
this.username = username;
this.password = password;
this.host = host;
this.port = port;
}
/**
* 构造基于秘钥认证的sftp对象
*/
public SFTPUtil(String username,String password, String host, int port, String privateKey) {
this.username = username;
this.password = password;
this.host = host;
this.port = port;
this.privateKey = privateKey;
}
public SFTPUtil(){}
/**
* 连接sftp服务器
*/
public void login(){
try {
JSch jsch = new JSch();
if (privateKey != null) {
jsch.addIdentity(privateKey);// 设置私钥
}
session = jsch.getSession(username, host, port);
if (password != null) {
session.setPassword(password);
}
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
log.info("sftp login success ------");
} catch (JSchException e) {
e.printStackTrace();
}
}
/**
* 关闭连接 server
*/
public void logout(){
if (sftp != null) {
if (sftp.isConnected()) {
sftp.disconnect();
}
}
if (session != null) {
if (session.isConnected()) {
session.disconnect();
}
}
log.info("sftp logout success ------");
}
/**
* 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
* @param basePath 服务器的基础路径
* @param directory 上传到该目录
* @param sftpFileName sftp端文件名
*/
public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{
try {
sftp.cd(basePath);
sftp.cd(directory);
} catch (SftpException e) {
//目录不存在,则创建文件夹
String [] dirs=directory.split("/");
String tempPath=basePath;
for(String dir:dirs){
if(null== dir || "".equals(dir)) continue;
tempPath+="/"+dir;
try{
sftp.cd(tempPath);
}catch(SftpException ex){
sftp.mkdir(tempPath);
sftp.cd(tempPath);
}
}
}
sftp.put(input, sftpFileName); //上传文件
}
/**
* 下载文件。
* @param directory 下载目录
* @param downloadFile 下载的文件
* @param saveFile 存在本地的路径
*/
public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException {
if (directory != null && !"".equals(directory)) {
sftp.cd(directory);
}
File file = new File(saveFile);
sftp.get(downloadFile, new FileOutputStream(file));
}
/**
* 下载文件
* @param directory 下载目录
* @param downloadFile 下载的文件名
* @return 字节数组
*/
public byte[] download(String directory, String downloadFile) throws SftpException, IOException {
if (directory != null && !"".equals(directory)) {
sftp.cd(directory);
}
InputStream is = sftp.get(downloadFile);
byte[] fileData = IOUtils.toByteArray(is);
return fileData;
}
/**
* 删除文件
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
*/
public void delete(String directory, String deleteFile) throws SftpException{
sftp.cd(directory);
sftp.rm(deleteFile);
}
/**
* 列出目录下的文件
* @param directory 要列出的目录
* @param
*/
public Vector<?> listFiles(String directory) throws SftpException {
return sftp.ls(directory);
}
/**
* 创建文件夹
* @param devFile 创建的文件夹目录
*/
public void mkdirFile(String devFile){
File file=new File(devFile);
if(!file.exists()){//如果文件夹不存在
file.mkdir();//创建文件夹
}
}
//下载、上传文件测试
public static void main(String[] args) throws SftpException, IOException {
try {
//本地密钥路径(生成密钥步骤请百度)
String ssh = "H:/id_rsa_2048";
//使用密钥登录 (或者用密码)
SFTPUtil sftp = new SFTPUtil("用户名","密码","IP地址", 端口号,ssh);
sftp.login();
//sftp文件存放目录
String directory = "/data/sms_marketing/20201231";
Vector vector = sftp.listFiles(directory);
//下载后本地文件存放目录
String dev = "C:/Users/senseinfo/Desktop/20201231/";
log.info("filename size --"+vector.size());
if (StringUtils.isEmpty(vector)){
log.info("未找到文件");
}else {
for (Object v:vector
) {
JSONObject json = (JSONObject) JSON.toJSON(v);
String filename = (String) json.get("filename");
log.info("-----"+filename);
sftp.mkdirFile(dev);
//下载sftp文件到本地
sftp.download(directory,filename,dev+filename);
}
}
//上传文件到sftp
File file = new File("C:/Users/senseinfo/Desktop/text.txt");
InputStream is = new FileInputStream(file);
sftp.upload("/receipt","20201231", "text.txt", is);
//退出登录
sftp.logout();
} catch (SftpException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
本文地址:https://blog.csdn.net/weixin_42152292/article/details/112025184
上一篇: 蓝桥杯-李白喝酒