【转】java使用jcraft访问sftp,实现文件上传下载删除的工具类

本文介绍如何使用 Java 的 Jsch 库实现 SFTP 协议的文件上传、下载及管理功能。通过具体代码示例展示了如何建立 SFTP 连接、上传文件、下载文件、创建目录、列出目录下的文件等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是个工具类 其他类调用的时候记得先声明一个全局变量

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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值