Browse Source

sftp上传下载测试通过一版,保存

xusonglin 5 years ago
parent
commit
1be925b34f

+ 16 - 1
pom.xml

@@ -5,7 +5,7 @@
 
     <groupId>com.jkcredit</groupId>
     <artifactId>asychronous</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.0.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <name>asychronous</name>
@@ -119,6 +119,21 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <configuration>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/resources</directory>
+                                    <filtering>true</filtering>
+                                    <includes>
+                                        <include>**</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
             </plugin>
         </plugins>
     </build>

+ 1 - 1
src/main/java/com/jkcredit/asychronous/ftp/CarDownloadRoute.java

@@ -14,7 +14,7 @@ import org.springframework.stereotype.Component;
  * @Date Created in 2018/6/22 上午11:49
  */
 @Slf4j
-@Component
+//@Component
 public class CarDownloadRoute extends RouteBuilder {
 
     @Value("${carftp.download.ftp}")

+ 1 - 11
src/main/java/com/jkcredit/asychronous/ftp/ManDownloadRoute.java

@@ -1,6 +1,7 @@
 package com.jkcredit.asychronous.ftp;
 
 import com.jkcredit.asychronous.process.ManLocationFileProcessor;
+import com.jkcredit.asychronous.util.SFTPUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.builder.RouteBuilder;
@@ -16,9 +17,6 @@ import org.springframework.stereotype.Component;
 @Slf4j
 @Component
 public class ManDownloadRoute extends RouteBuilder {
-
-    @Value("${manftp.download.ftp}")
-    private String sftpServer;
     @Value("${manftp.download.dir}")
     private String downloadLocation;
 
@@ -27,18 +25,10 @@ public class ManDownloadRoute extends RouteBuilder {
 
     @Override
     public void configure() {
-        downRoute();
         parseRoute();
     }
 
     /**
-     * 下载路由
-     */
-    private void downRoute() {
-        from(sftpServer).to(downloadLocation).log(LoggingLevel.INFO, log, "Downloaded ManFile ${file:name} complete.");
-    }
-
-    /**
      * 解析路由
      */
     private void parseRoute() {

+ 18 - 0
src/main/java/com/jkcredit/asychronous/job/ManJob.java

@@ -38,6 +38,10 @@ public class ManJob {
     private String dir;
     @Value("${ftp.keyFilePath}")
     private String keyFilePath;
+    @Value("${ftp.dir.manDownload}")
+    private String manDownloadPath;
+    @Value("${manftp.download.info}")
+    private String fileDir;
 
     @Autowired
     private ManService manService;
@@ -68,7 +72,9 @@ public class ManJob {
                 e.printStackTrace();
             }
             try {
+                log.info("文件上传 路径:{}", File.separator + dir + File.separator +  endTime.toString() + ".xlsx", fileName);
                 SFTPUtil.upload(host, port, userName, passphrase, File.separator + dir + File.separator +  endTime.toString() + ".xlsx", fileName, keyFilePath);
+                // todo 上传完删除本地文件
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -107,4 +113,16 @@ public class ManJob {
 //            log.info("ManExcel:{}", fileName);
 //        SFTPUtil.upload(host, port, userName, passphrase, dir, fileName);
     }
+
+    @Scheduled(cron = "0 0/1 * * * ?", zone = "Asia/Shanghai")
+    private void downloadFile() {
+        try {
+            log.info("下载文件 localDir == " + fileDir);
+            log.info("下载文件 manDownloadPath == " + manDownloadPath);
+            SFTPUtil.download(userName, port, host, passphrase, keyFilePath, fileDir, manDownloadPath);
+        } catch (Exception e) {
+            log.error("下载文件失败,失败原因:{}", e.getMessage());
+        }
+    }
+
 }

+ 82 - 3
src/main/java/com/jkcredit/asychronous/util/SFTPUtil.java

@@ -4,10 +4,12 @@ import com.jcraft.jsch.ChannelSftp;
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.Session;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
 
 import java.io.*;
 import java.text.SimpleDateFormat;
-import java.util.Properties;
+import java.util.*;
 
 /**
  * @description:
@@ -20,7 +22,6 @@ public class SFTPUtil {
     static JSch jsch = null;
     static Session session = null;
     static ChannelSftp channel = null;
-
     /**
      * 密钥连接到指定的IP
      *
@@ -58,7 +59,7 @@ public class SFTPUtil {
     /**
      * 关闭连接
      */
-    private static void close() {
+    public static void close() {
         if (channel != null) {
             try {
                 channel.disconnect();
@@ -98,5 +99,83 @@ public class SFTPUtil {
         // todo 秘钥文件路径有问题 需要测试上传  下载需要在util中写个方法,替换ftp文件夹下的route
     }
 
+    /**
+     * 下载文件
+     * 备份本地文件,再下载服务器端最新文件
+     * @param localPath 本地存放路径
+     * @param remotePath 服务器端存放路径
+     */
+    public static void download(String username, int port, String host, String passphrase, String keyFilePath,String localPath, String remotePath) throws Exception {
+        // src linux服务器文件地址,dst 本地存放地址
+        connect(username, host, port, passphrase, keyFilePath);
+        if (channel == null) {
+            log.info("SFTP服务器未连接");
+            return;
+        }
+        FileOutputStream output;
+
+        // 获取未读取文件
+        try {
+            List<String> files = listFiles(remotePath);
+            for (String fileName : files) {
+                output = new FileOutputStream(localPath + "/" + fileName);
+                log.info("下载文件:" + fileName + "开始");
+                channel.get(remotePath + "/" +fileName, output);
+                log.info("下载文件:" + fileName + "成功");
+                delete(remotePath, fileName);
+                output.close();
+            }
+        } catch (Exception e) {
+            log.error("下载文件失败,失败原因:{}", e.getMessage());
+        } finally {
+            close();
+        }
+    }
+
+    /**
+     * 删除文件
+     *
+     * @param directory
+     *            要删除文件所在目录
+     * @param deleteFile
+     *            要删除的文件
+     * @throws JSchException
+     */
+    private static void delete(String directory, String deleteFile) throws Exception {
+        if (channel == null) {
+            log.info("SFTP服务器未连接");
+            return;
+        }
+        channel.cd(directory);
+        channel.rm(deleteFile);
+        log.info("删除成功");
+    }
+
+    /**
+     * 列出目录下的文件
+     *
+     * @param directory
+     *            要列出的目录
+     * @param sftp
+     * @return
+     * @throws JSchException
+     */
+    @SuppressWarnings("rawtypes")
+    private static List<String> listFiles(String directory) throws Exception {
+        if (channel == null) {
+            log.info("SFTP服务器未连接");
+            return null;
+        }
+        Vector vector = channel.ls(directory);
 
+        List<String> fileNameList = new ArrayList<>();
+        for (Object object : vector) {
+            String fileName = ((ChannelSftp.LsEntry) object).getFilename();
+            String[] array = StringUtils.split(fileName,".");
+            if (array.length == 2 && (array[1].equals("xlsx") || array[1].equals("xls"))) {
+                fileNameList.add(fileName);
+            }
+        }
+        return fileNameList;
+    }
 }

+ 20 - 19
src/main/resources/application-dev.yml

@@ -1,14 +1,14 @@
 spring:
   data:
     mongodb:
-      uri: mongodb://172.31.1.10:27017/asychronous
+      uri: mongodb://127.0.0.1:27017/asynchronous
   application:
     name: asychronous
   rabbitmq:
-    host: 122.14.207.194
+    host: 127.0.0.1
     port: 5672
-    username: szn
-    password: szn
+    username: guest
+    password: guest
     publisher-confirms: true
     publisher-returns: true
     listener:
@@ -22,28 +22,29 @@ camel:
     main-run-controller: true
 manftp:
   download:
-    ftp: ftp://jkxy@git.jkcredit.com:30021/download/man/?password=jkxy1234&delay=5s&delete=true&readLock=fileLock&disconnect=true&recursive=true&streamDownload=true&passiveMode=true
-    dir: file:/Users/sunzhaoning/ftp/down/man
-    info: /Users/sunzhaoning/ftp/down/man
+    dir: C:\Users\Administrator\Desktop\ftp
+    info: C:\Users\Administrator\Desktop\ftp
   upload:
-    local: /Users/sunzhaoning/ftp/upload/man
+    local: C:\Users\Administrator\Desktop\ftp
 carftp:
   download:
-    ftp: ftp://jkxy@git.jkcredit.com:30021/download/car/?password=jkxy1234&delay=5s&delete=true&readLock=fileLock&disconnect=true&recursive=true&streamDownload=true&passiveMode=true
-    dir: file:/Users/sunzhaoning/ftp/down/car
-    info: /Users/sunzhaoning/ftp/down/car
+    ftp: ftp://jkxyftp@192.168.1.99:21/download/car/?password=jkxyftp&delay=5s&delete=true&readLock=fileLock&passiveMode=true
+    dir: file:/data/ftp/down/car
+    info: /data/ftp/down/car
   upload:
-     local: /Users/sunzhaoning/ftp/upload/car
+    local: /data/ftp/upload/car
 
 # 上传文件配置
 ftp:
-  host: git.jkcredit.com
-  port: 30021
-  username: jkxy
-  password: jkxy1234
+  host: 103.105.200.77
+  port: 10088
+  username: jksftp
+  passphrase: lgZ7dRdrhehp2bj
+  keyFilePath: C:\Users\Administrator\Desktop\sftp_rsa
   dir:
-    man: upload/man
-    car: upload/car
+    man: download
+    car: upload
+    manDownload: download
 server:
   port: 10081
 
@@ -53,4 +54,4 @@ server:
 #      springframework:
 #        data:
 #          mongodb:
-#            core: DEBUG
+#            core: DEBUG

+ 28 - 8
src/main/resources/application-prod.yml

@@ -16,13 +16,31 @@ spring:
         acknowledge-mode: manual
       simple:
         acknowledge-mode: manual
+#spring:
+#  data:
+#    mongodb:
+#      uri: mongodb://127.0.0.1:27017/asynchronous
+#  application:
+#    name: asychronous
+#  rabbitmq:
+#    host: 127.0.0.1
+#    port: 5672
+#    username: guest
+#    password: guest
+#    publisher-confirms: true
+#    publisher-returns: true
+#    listener:
+#      direct:
+#        acknowledge-mode: manual
+#      simple:
+#        acknowledge-mode: manual
 #java进程在后台运行
 camel:
   springboot:
     main-run-controller: true
 manftp:
   download:
-    ftp: ftp://jkxyftp@192.168.1.99:21/download/man/?password=jkxyftp&delay=5s&delete=true&readLock=fileLock&passiveMode=true
+#    ftp: sftp://jkxyftp@192.168.1.99:21/download/man/?password=jkxyftp&delay=5s&delete=true&readLock=fileLock&passiveMode=true
     dir: file:/data/ftp/down/man
     info: /data/ftp/down/man
   upload:
@@ -37,13 +55,15 @@ carftp:
 
 # 上传文件配置
 ftp:
-  host: 192.168.1.99
-  port: 21
-  username: jkxyftp
-  password: jkxyftp
+  host: 103.105.200.77
+  port: 10088
+  username: jksftp
+  passphrase: lgZ7dRdrhehp2bj
+  keyFilePath: /data/asyncronous/bin/sftp_rsa
   dir:
-    man: upload/man
-    car: upload/car
+    man: upload
+    car: upload
+    manDownload: /download
 server:
   port: 10081
 
@@ -53,4 +73,4 @@ server:
 #      springframework:
 #        data:
 #          mongodb:
-#            core: DEBUG
+#            core: DEBUG

+ 1 - 1
src/main/resources/bootstrap.yml

@@ -1,3 +1,3 @@
 spring:
   profiles:
-    active: prod
+    active: prod