# sftp-file-manager **Repository Path**: zycra/sftp-file-manager ## Basic Information - **Project Name**: sftp-file-manager - **Description**: SFTP文件管理工具 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2022-09-02 - **Last Updated**: 2024-07-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## sftp-file-manager [![](https://img.shields.io/badge/license-MIT-green)](https://mit-license.org/) [![](https://img.shields.io/badge/JDK-17%2B-blue)](https://www.oracle.com/java/technologies/downloads/#java17) [![](https://img.shields.io/badge/Stars-0%2B-orange)](https://gitee.com/zycra/sftp-file-manager) 依赖`jsch`实现SFTP文件上传及下载,加入common-pool实现SFTP连接池化管理,封装统一文件加解密实现。 ## 快速开始 ### 引入依赖 ```xml com.gitee.zycra sftp-file-manager 1.0.0 ``` ### 密钥生成 ```java class SM2UtilTest { @Test void sm2test() { KeyPair keyPair = SM2Util.createECKeyPair(); String publicKey = SM2Util.getPublicKey(keyPair); String privateKey = SM2Util.getPrivateKey(keyPair); System.out.println("公钥:" + publicKey); System.out.println("私钥:" + privateKey); } } ``` ### 使用示例 ```java public class CommonTestConfig { public static final String PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgKhOTICR2DUD+nXzABSIvuyC6vXPqrfjH+8H" + "/sK2fdfWgCgYIKoEcz1UBgi2hRANCAAQHvRm7dVSi7X+us8PbJlFl6sJ5fzyuP8wpCjxZhcHuGHWTJnAiEyn5pJAWiNxgopVGoRuUpcsoZpD1GUrG4duk"; public static final String PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEB70Zu3VUou1/rrPD2yZRZerCeX88rj/MKQo8WYXB7hh1kyZwIhMp" + "+aSQFojcYKKVRqEblKXLKGaQ9RlKxuHbpA=="; private static final String CONNECT_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" + "MIIEowIBAAKCAQEA07mgt5SLONchEyLP+DjSkBNz/lE6hvUkzB3+bmU4JbI3GCK+\n" + "If8BruNfmGiMzWW79vh9Gg039EMRQK2bsWBEdhmT9y86Yln53rIy7Nk+PKJv0BKu\n" + "U2tbudT8mIN8+fxiEOZeqmxRjgt1nvvGEgVAjSf9lCPf9fHwJKSKhS+I4LxtVWwd\n" + "QcALwELrYLoQynrJXaop/MG9SDNSpOg00NeJs43X0lAgl6HL6QR86x2wBgT3myav\n" + "UGtlsX39s+CcT2Ky4vSv9mdSqRsvCYAGTOuICa9RPQ5fdkbAJ5aEpSaVXV9ElmKz\n" + "Hxb7SxXNcpY2D1NyJU16YOJIiHxALfSrn6WyJwIDAQABAoIBAQDAdStv1Ppc98kb\n" + "8PglBdn5l4VH9ySBixMg7F7ckOvh8Eb+jI5SrtAj3pGGI/thtgmPrT9i0AM96T0k\n" + "kutE6GIzDHshJXAn+OwWj9uUysE1Mt76wBBwydU+bioSpOuU/eNSw2Xn+sCDo00O\n" + "8ISS2u1boq9x2s55baxCUsOL37LHvTen6+q9EPIi34m2gHo/T4MqK+4lhhjBKvAZ\n" + "/p/NTFs0+Can9s3ApLCLFxs/qeSf3RH6P4sDtkI4XZIZ8CpgOcDcqBX0sxFY9tRn\n" + "uiR9bdvsUUNU0XbnS+cFlAgdxqnDk+zYyZhl9F6GRkBj2Wwt9nNIVVnzPGv7IWoS\n" + "Z+qbYL6hAoGBAP5S1GDBEnTFaHR1CD5RQ7LKTFnW31JHnPlNZXhQpNHtaVHcPmh4\n" + "agwsKbdzq043ahnoc1254KcY3n0OWDNPH7+72TEWTzg9fmDC2Swg/P6XhtydIYjE\n" + "rSTxP7y7AwSrK/gXPxNY7zx3LQ5GOiUIeBVc0q2zm4gVetzPMHC1aaHXAoGBANUe\n" + "6dY0XnAYSWDYdZWbsWuTm1BeCjNhwg0EyRiXVXV96J8KGdwD00Cx3jZFNhuMTuz7\n" + "Y/bupJsL8eZ3vX88045gUAbfDvRD0+zMBNG5nWhaIIQIx2XdwDPr6RCbkaiNqqCW\n" + "IKZNsh57VLiL5rMuiyc6OaKDl2obRn/8gFrjuQgxAoGAZ8Z4rrpZw5hB1TNkF7ml\n" + "PDFcElShb7uVDA1O2FdfyeFsVmDeflaUPz9ODnN+dT4bZ1L4sEgGqWh2cOUHjHg+\n" + "5kfKikMmNDazeNxJLb6QPXqrJx5e7qYCWM6wSVyuEJugJ22k6Uoi5LNkiSyS0UWx\n" + "alYkCYj+b/sD1VId2//KiKUCgYAYSrPAlKuG/12tyj5s1Rg9+M8lM/LZtHTX4wnA\n" + "4c7922IebppP96emoh9/9BecwDtmy6izRrRAb/YcnN1emWJLwjKc9ePQd8K6JO8P\n" + "sKZ+dHdsVUvVEpeL04H3QKQzoCIot7P1ALoiu1AG0Pt0xQNbb0mOeo1RrNY2VGOU\n" + "+IvooQKBgEbevtPzyn2PAMPiUcjA0wh2RhVrpmgJ0EXBnZ8wsDY2y1BL0QMZS6dv\n" + "1jWHSIWSuJgY0TXvQ2786TpQONd6qwmm0NFaOFh41lM8VotD59qu9bm9xHG4hvw7\n" + "7dozPC49J/+w5Luotdzz5aGjxmatRTEGtEIsColiYZAQD425a46v\n" + "-----END RSA PRIVATE KEY-----"; public static final String LOCAL_PATH_AND_FILE_NAME = "C:/1.txt"; public static final String SERVER_PATH = "/data"; public static final String SERVER_FILE_NAME = "1.txt"; public static final String LOCAL_PATH = "C:/temp"; public static final String OK_FILE_PATH = "C:/temp/ok/all.ok"; public static final ConnectionConfig CONNECT_CONFIG = new ConnectionConfig("localhost", "test", null, 22, CONNECT_KEY, null); } class SFTPUtilTest { private final ExecutorService executorService = Executors.newFixedThreadPool(10); @Test void testUpload() { UploadParam uploadParam = new UploadParam() .setEncrypt(true) .setEncryptKey(CommonTestConfig.PUBLIC_KEY) .setSignKey(CommonTestConfig.PRIVATE_KEY) .setLocalFilePathAndName(CommonTestConfig.LOCAL_PATH_AND_FILE_NAME) .setDeleteOriginFile(true) .setServerPath(CommonTestConfig.SERVER_PATH) .setServerFileName(CommonTestConfig.SERVER_FILE_NAME); boolean success = SFTPUtil.upload(CommonTestConfig.CONNECT_CONFIG, uploadParam); Assertions.assertTrue(success); } @Test void testDownload() { DownloadParam downloadParam = new DownloadParam() .setDecrypt(true) .setDecryptKey(CommonTestConfig.PRIVATE_KEY) .setCheckSignKey(CommonTestConfig.PUBLIC_KEY) .setFileNameList(List.of(CommonTestConfig.SERVER_FILE_NAME)) .setServerPath(CommonTestConfig.SERVER_PATH) .setLocalPath(CommonTestConfig.LOCAL_PATH); List fileList = SFTPUtil.download(CommonTestConfig.CONNECT_CONFIG, downloadParam); Assertions.assertNotNull(fileList); for (String fileName : fileList) { System.out.println(fileName); } } @Test void testLs() { try { List fileList = SFTPUtil.ls(CommonTestConfig.CONNECT_CONFIG, CommonTestConfig.SERVER_PATH); Assertions.assertNotNull(fileList); for (String fileName : fileList) { System.out.println(fileName); } } catch (JSchException e) { e.printStackTrace(); } } @Test void testWriteOKFile() { List fileNameList = List.of(CommonTestConfig.SERVER_FILE_NAME); SFTPUtil.writeOKFile(fileNameList, CommonTestConfig.OK_FILE_PATH); File file = new File(CommonTestConfig.OK_FILE_PATH); Assertions.assertTrue(file.exists()); } @Test void testReadOKFile() { List fileList = SFTPUtil.readOKFile(CommonTestConfig.OK_FILE_PATH); Assertions.assertNotNull(fileList); for (String fileName : fileList) { System.out.println(fileName); } } @Test void mulitThreadUpload() { String path = "C:/test"; File dir = new File(path); String[] fileList = dir.list(); Assertions.assertNotNull(fileList); CountDownLatch countDownLatch = new CountDownLatch(fileList.length); for (String fileName : fileList) { UploadParam uploadParam = new UploadParam() .setEncrypt(true) .setEncryptKey(CommonTestConfig.PUBLIC_KEY) .setSignKey(CommonTestConfig.PRIVATE_KEY) .setDeleteOriginFile(false) .setServerPath(CommonTestConfig.SERVER_PATH) .setServerFileName(fileName) .setLocalFilePathAndName(path + "/" + fileName); executorService.execute(() -> { SFTPUtil.upload(CommonTestConfig.CONNECT_CONFIG, uploadParam); countDownLatch.countDown(); }); } try { countDownLatch.await(); System.out.println("上传完成"); } catch (InterruptedException e) { e.printStackTrace(); } } @Test void multiThreadDownload() { List fileList = null; try { fileList = SFTPUtil.ls(CommonTestConfig.CONNECT_CONFIG, CommonTestConfig.SERVER_PATH); } catch (JSchException e) { e.printStackTrace(); } Assertions.assertNotNull(fileList); Assertions.assertFalse(fileList.isEmpty()); CountDownLatch countDownLatch = new CountDownLatch(fileList.size()); for (String fileName : fileList) { DownloadParam downloadParam = new DownloadParam() .setDecrypt(true) .setDecryptKey(CommonTestConfig.PRIVATE_KEY) .setCheckSignKey(CommonTestConfig.PUBLIC_KEY) .setFileNameList(List.of(fileName)) .setServerPath(CommonTestConfig.SERVER_PATH) .setLocalPath(CommonTestConfig.LOCAL_PATH); executorService.execute(() -> { SFTPUtil.download(CommonTestConfig.CONNECT_CONFIG, downloadParam); countDownLatch.countDown(); }); } try { countDownLatch.await(); System.out.println("下载完成"); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` ## 常用方法 | 方法名 | 说明 | | -------------------- | ---------------- | | SFTPUtil#upload | 文件上传 | | SFTPUtil#download | 文件下载 | | SFTPUtil#ls | 获取目录下文件名 | | SFTPUtil#writeOKFile | 写入OK文件 | | SFTPUtil#readOKFile | 读取OK文件 |