这是个工具类 其他类调用的时候记得先声明一个全局变量
private static ChannelSftp sftp = null;
然后具体调用方法的时候把sftp传进去。
一定记得要先登陆 再进行文件操作 最后一定要断开ftp
java访问ftp有两种方式 我觉得最直观的区别就是看ftp的端口 21的是普通ftp 22的使用jcraft
先把maven依赖留下
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.51</version>
</dependency>
非maven项目的话 我留个链接 不知道会不会过一段时间就失效 jar包下载
百度这个com.jcraft.jsch 有很多的 版本我觉得应该差的不太多
java代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import java.util.Vector;
import org.apache.log4j.Logger;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
public class SFtpUtils
{
private static Logger log = Logger.getLogger(SFtpUtils.class.getName());
/**
* 链接ftp
* @param user 账号
* @param host 主机
* @param port 端口
* @param password 密码
*/
public static ChannelSftp getConnect(String user , String host , int port , String password)
{
ChannelSftp sftp = null;
try
{
JSch jsch = new JSch();
//获取sshSession 账号-ip-端口
Session sshSession =jsch.getSession(user, host,port);
//添加密码
sshSession.setPassword(password);
Properties sshConfig = new Properties();
//严格主机密钥检查
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
//开启sshSession链接
sshSession.connect();
//获取sftp通道
Channel channel = sshSession.openChannel("sftp");
//开启
channel.connect();
sftp = (ChannelSftp) channel;
log.info("登陆成功");
} catch (Exception e)
{
e.printStackTrace();
log.info("登陆失败");
}
return sftp;
}
/**
* 关闭连接
* @param sftp
*/
public static void close(ChannelSftp sftp)
{
try
{
if(sftp.getSession().isConnected())
{
sftp.getSession().disconnect();
}
if(sftp.isConnected())
{
sftp.quit();
sftp.disconnect();
}
log.info("关闭连接成功");
} catch (JSchException e)
{
e.printStackTrace();
log.info("关闭连接失败");
}
}
/**
* @param sftp
* @param saveFile 上传文件的根路径 /DCP/kdm/
* @param uploadFile 上传哪个文件的路径
* @param fileName 文件名
* @param docName 上传至根目录的哪个文件夹下(新建文件夹 拼音或cplId)
* @return 服务器上文件名
* @throws SftpException
*/
public static String upload(ChannelSftp sftp,String saveFile,String uploadFile, String fileName)
{
File file = new File(uploadFile);
String[] saveFilePaths = saveFile.split("//");
String path = "";
for(String saveFilePath:saveFilePaths)
{
path += saveFilePath+"//";
creatDocs(sftp,path);
}
try
{
//先进入指定文件夹
sftp.cd(saveFile);
//把文件上传至指定目录内
FileInputStream fis = new FileInputStream(file);
sftp.put(fis, fileName);
fis.close();
log.info("文件上传成功");
} catch (Exception e)
{
e.printStackTrace();
log.info("文件上传失败");
}
return file == null ? null : fileName;
}
/**
* 创建文件夹 如果不存在
* @param sftp
* @param path
*/
private static void creatDocs(ChannelSftp sftp, String path)
{
try
{
sftp.cd(path);
sftp.ls(path);
} catch (SftpException e)
{
log.info("路径不存在,准备新建");
try
{
sftp.mkdir(path);
log.info("路径创建成功");
} catch (SftpException e1)
{
log.info("路径创建失败");
}
}
}
/**
* 下载文件
* @param directory 下载目录
* @param downloadFile 下载的文件
* @param saveFile 存在本地的路径
* @throws Exception
*/
public String download(ChannelSftp sftp,String directory, String downloadFile, String saveFile)
{
try
{
if (directory != null && !"".equals(directory))
{
sftp.cd(directory);
}
File file = new File(saveFile);
FileOutputStream out = new FileOutputStream(file);
sftp.get(downloadFile, out);
out.close();
log.info("文件下载成功");
return "success";
} catch (Exception e) {
log.info("文件下载失败");
return "not found";
}
}
/**
* 删除文件
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
* @throws Exception
*/
public void delete(ChannelSftp sftp,String directory, String deleteFile) throws Exception
{
try
{
sftp.cd(directory);
sftp.rm(deleteFile);
log.info("文件删除成功");
} catch (Exception e)
{
log.info("文件删除失败");
}
}
/**
* 列出目录下的文件
* @param directory 要列出的目录
* @param sftp
* @return
* @throws SftpException
*/
public Vector listFiles(ChannelSftp sftp,String directory) throws SftpException
{
return sftp.ls(directory);
}
}