第一步 引入依赖包
基于maven构建工程,pom.xml加入依赖。
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency>
第二步 工具类
package com.guohuai.util; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Properties; import java.util.Vector; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; /** * * @ClassName: SFTPUtil * @Description: sftp连接工具类 * @date 2017年5月22日 下午11:17:21 * @version 1.0.0 */ public class SFTPUtil { private transient Logger log = LoggerFactory.getLogger(this.getClass()); private ChannelSftp sftp; private Session session; /** FTP 登录用户名*/ private String username; /** FTP 登录密码*/ private String password; /** 私钥 */ private String privateKey; /** FTP 服务器地址IP地址*/ private String host; /** FTP 端口*/ private int port; /** * 构造基于密码认证的sftp对象 * @param userName * @param password * @param host * @param port */ public SFTPUtil(String username, String password, String host, int port) { this.username = username; this.password = password; this.host = host; this.port = port; } /** * 构造基于秘钥认证的sftp对象 * @param userName * @param host * @param port * @param privateKey */ public SFTPUtil(String username, String host, int port, String privateKey) { this.username = username; this.host = host; this.port = port; this.privateKey = privateKey; } public SFTPUtil(){} /** * 连接sftp服务器 * @throws Exception */ public void login(){ try { JSch jsch = new JSch(); if (privateKey != null) { jsch.addIdentity(privateKey);// 设置私钥 log.info("sftp connect,path of private key file:{}" , privateKey); } log.info("sftp connect by host:{} username:{}",host,username); session = jsch.getSession(username, host, port); log.info("Session is build"); if (password != null) { session.setPassword(password); } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); log.info("Session is connected"); Channel channel = session.openChannel("sftp"); channel.connect(); log.info("channel is connected"); sftp = (ChannelSftp) channel; log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port)); } catch (JSchException e) { log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()}); } } /** * 关闭连接 server */ public void logout(){ if (sftp != null) { if (sftp.isConnected()) { sftp.disconnect(); log.info("sftp is closed already"); } } if (session != null) { if (session.isConnected()) { session.disconnect(); log.info("sshSession is closed already"); } } } /** * 将输入流的数据上传到sftp作为文件 * @param directory 上传到该目录 * @param sftpFileName sftp端文件名 * @param in 输入流 * @throws SftpException * @throws Exception */ public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{ try { sftp.cd(directory); } catch (SftpException e) { log.warn("directory is not exist"); sftp.mkdir(directory); sftp.cd(directory); } sftp.put(input, sftpFileName); log.info("file:{} is upload successful" , sftpFileName); } /** * 上传单个文件 * @param directory 上传到sftp目录 * @param uploadFile 要上传的文件,包括路径 * @throws FileNotFoundException * @throws SftpException * @throws Exception */ public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{ File file = new File(uploadFile); upload(directory, file.getName(), new FileInputStream(file)); } /** * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。 * @param directory 上传到sftp目录 * @param sftpFileName 文件在sftp端的命名 * @param byteArr 要上传的字节数组 * @throws SftpException * @throws Exception */ public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{ upload(directory, sftpFileName, new ByteArrayInputStream(byteArr)); } /** * 将字符串按照指定的字符编码上传到sftp * @param directory 上传到sftp目录 * @param sftpFileName 文件在sftp端的命名 * @param dataStr 待上传的数据 * @param charsetName sftp上的文件,按该字符编码保存 * @throws UnsupportedEncodingException * @throws SftpException * @throws Exception */ public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{ upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName))); } /** * 下载文件 * @param directory 下载目录 * @param downloadFile 下载的文件 * @param saveFile 存在本地的路径 * @throws SftpException * @throws FileNotFoundException * @throws Exception */ 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)); log.info("file:{} is download successful" , downloadFile); } /** * 下载文件 * @param directory 下载目录 * @param downloadFile 下载的文件名 * @return 字节数组 * @throws SftpException * @throws IOException * @throws Exception */ 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); log.info("file:{} is download successful" , downloadFile); return fileData; } /** * 删除文件 * @param directory 要删除文件所在目录 * @param deleteFile 要删除的文件 * @throws SftpException * @throws Exception */ public void delete(String directory, String deleteFile) throws SftpException{ sftp.cd(directory); sftp.rm(deleteFile); } /** * 列出目录下的文件 * @param directory 要列出的目录 * @param sftp * @return * @throws SftpException */ public Vector<?> listFiles(String directory) throws SftpException { return sftp.ls(directory); } public static void main(String[] args) throws SftpException, IOException { SFTPUtil sftp = new SFTPUtil("lanhuigu", "123456", "192.168.200.12", 22); sftp.login(); //byte[] buff = sftp.download("/opt", "start.sh"); //System.out.println(Arrays.toString(buff)); File file = new File("D:\\upload\\index.html"); InputStream is = new FileInputStream(file); sftp.upload("/data/work", "test_sftp_upload.csv", is); sftp.logout(); } }
相关推荐
在上面的示例代码中,我们创建了一个SFTPUtils类,其中包含了连接SFTP服务器、上传文件、下载文件等方法。这些方法使用JSch库来实现SFTP的功能。 在实际应用中,我们可以根据需要封装成一个util类,提供给其他应用...
在本示例中,我们将深入探讨如何使用JSch库来实现通过SFTP上传整个文件夹的功能。 首先,我们需要在项目中添加JSch库。如果你使用Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>...
在Java编程中,SFTP(Secure File ...综上所述,Java操作SFTP上传和下载文件主要涉及到JSch库的使用,包括连接配置、通道创建、文件操作以及断开连接等步骤。在实际开发中,应结合具体需求,优化代码并确保安全性。
JSch - Java实现的SFTP(文件上传详解篇)
例如,`put()`方法用于上传文件。 ```java FileInputStream fis = new FileInputStream("localFilePath"); sftpChannel.put(fis, "remoteFilePath"); fis.close(); ``` 4. **文件下载**:下载文件则可以使用`get()...
- 递归上传整个目录:你可以编写一个递归函数,遍历本地目录并逐个上传文件。 - 断点续传:如果支持,可以利用SFTP的`fstat`和`position`命令来实现。 - 传输进度监控:通过监听`ChannelSftp`的`progress`事件,...
本文将详细讲解如何使用开源库JSch来实现在Java中进行SFTP的上传、下载以及删除文件的方法。 JSch是一个纯Java实现的SSH2库,它提供了对SFTP的支持,允许我们在Java应用中安全地执行文件传输。首先,我们需要添加...
4. 上传文件:使用SFTPChannel的`put`方法将本地文件上传到服务器的指定路径。 5. 关闭连接:在完成上传后,记得关闭SFTP通道和Session。 以下是使用JSCH上传文件的示例代码: ```java JSch jsch = new JSch(); ...
本文将深入探讨如何使用Java实现SFTP(Secure File Transfer Protocol)和FTP(File Transfer Protocol)进行文件的上传与下载,以满足在Linux服务器上的操作需求。 首先,FTP是一种用于在网络之间传输文件的标准...
5. 使用`put()`方法上传文件。 6. 完成上传后,记得断开连接。 以下是一个简单的SFTP上传示例: ```java import com.jcraft.jsch.*; public class SftpUploader { public static void uploadFile(String host, ...
本篇文章将详细探讨如何使用Java通过SFTP模式实现FTP的文件上传、下载和删除功能。 一、SFTP简介 SFTP与传统的FTP不同,FTP在明文传输数据,存在安全隐患,而SFTP则利用SSH提供的加密机制,确保数据在传输过程中的...
3. **文件上传**:在Java中实现SFTP上传文件的核心代码通常包括以下步骤: - 创建`JSch`实例。 - 使用`JSch`实例创建`Session`对象,设置主机名、端口、用户名和登录方式相关参数。 - 调用`Session`的`connect()`...
以上就是使用Java Swing实现SFTP文件夹上传的基本步骤,包括建立SSH连接、使用SFTP通道、上传文件和递归上传文件夹。对于生产环境,建议添加异常处理和错误提示,以及更安全的策略,如使用密钥对而非密码进行身份...
现在我们有了基本的连接,可以实现上传文件的方法: ```java public void uploadFile(String localPath, String remotePath) throws SftpException { FileInputStream fis = new FileInputStream(localPath); ...
例如,可能存在一个`uploadFile()`方法用于上传文件,另一个`downloadFile()`方法用于下载文件。这些方法通常会处理异常,提供日志记录,并可能支持重试机制,以提高文件传输的可靠性。 总的来说,`jsch.jar`和`...
java使用sftp实现文件的上传与分片上传
这个工具类提供了上传文件的功能,可以根据需要扩展其他功能,如下载文件、删除文件、创建目录等。通过调用`SftpUtil.uploadFile()`方法,可以轻松地实现SFTP文件上传。 总之,JSch库为Java开发者提供了一个强大的...
总的来说,Java结合JSch库可以方便地实现与SFTP服务器的交互,包括上传文件压缩包、解压缩、创建目录等操作。这些功能在分布式系统、云存储和自动化运维场景中都十分常见。通过熟练掌握这些技能,开发人员能够构建...
以下是一个简单的Java SFTP上传文件的示例: 1. 引入JSch库: ```java import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; ``` 2. 创建并配置JSch对象,建立SSH...