# 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://mit-license.org/)
[](https://www.oracle.com/java/technologies/downloads/#java17)
[](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文件 |