1 Battery日志添加电压值
authorsnickersun <snickersun@qq.com>
Sat, 22 Feb 2020 18:58:39 +0000 (02:58 +0800)
committersnickersun <snickersun@qq.com>
Sat, 22 Feb 2020 18:58:39 +0000 (02:58 +0800)
2 添加FTP上传日志支持,短信命令触发
#logctl#=current
#logctl#=reset
#logctl#=icfota.snicker.com.cn,ftpuser,iclog
#logctl#=upload,all
#logctl#=upload,APIlog

app/app.iml
app/libs/ftp4j-1.7.2.jar [new file with mode: 0644]
app/src/main/java/com/enqualcomm/support/Config.java
app/src/main/java/com/enqualcomm/support/ICSmsManager.java
app/src/main/java/com/enqualcomm/support/bean/Runtime.java
app/src/main/java/com/enqualcomm/support/utils/BatteryUtil.java
app/src/main/java/com/enqualcomm/support/utils/DeviceInfoUtil.java
app/src/main/java/com/enqualcomm/support/utils/Util.java
app/src/main/java/com/enqualcomm/support/utils/ftpUtils.java [new file with mode: 0644]
dNSCache/src/main/java/com/sina/util/dnscache/log/FileUtil.java

index 19e98f4..1a534bf 100644 (file)
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner:0.5@aar" level="project" />\r
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:exposed-instrumentation-api-publish:0.5@aar" level="project" />\r
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource:2.2.2@aar" level="project" />\r
+    <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\ftp4j-1.7.2.jar:unspecified@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\LauncherCtrl.jar:unspecified@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\okio-2.4.3.jar:unspecified@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: com.android.support:support-annotations:25.1.0@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: com.kymjs.rxvolley:rxvolley:1.1.3@aar" level="project" />\r
     <orderEntry type="library" name="Gradle: io.reactivex:rxandroid:1.1.0@aar" level="project" />\r
     <orderEntry type="module" module-name="dNSCache" />\r
-    <orderEntry type="module" module-name="dNSCache" />\r
-    <orderEntry type="module" module-name="dNSCache" />\r
-    <orderEntry type="module" module-name="dNSCache" />\r
-    <orderEntry type="module" module-name="dNSCache" />\r
-    <orderEntry type="module" module-name="dNSCache" />\r
-    <orderEntry type="module" module-name="dNSCache" />\r
-    <orderEntry type="module" module-name="dNSCache" />\r
   </component>\r
 </module>
\ No newline at end of file
diff --git a/app/libs/ftp4j-1.7.2.jar b/app/libs/ftp4j-1.7.2.jar
new file mode 100644 (file)
index 0000000..fca26ec
Binary files /dev/null and b/app/libs/ftp4j-1.7.2.jar differ
index fbc4fa6..c20d55d 100644 (file)
@@ -179,7 +179,19 @@ public class Config {
   public static String work_mode = "2@1";\r
   \r
   private static final int yunosuuid = 0;\r
-  \r
+\r
+\r
+  public static final String DefaultHost="watch.jiai.pro";\r
+  public static final int DefaultPort=8090;\r
+\r
+  public static final String DefaultLogFtpServer="icfota.snicker.com.cn";\r
+  public static final String DefaultLogFtpUser="ftpuser";\r
+  public static final String DefaultLogFtpPWD="iclog";\r
+\r
+\r
+  public static final String DefaultWiFiSSID="Xplay6";\r
+  public static final String DefaultWiFiPWD="87654321";\r
+\r
   static  {\r
   \r
   }\r
@@ -291,6 +303,61 @@ public class Config {
 \r
   final static String KeyHeartBeatCycle="ServerHeartBeatCycle";\r
 \r
+\r
+\r
+  final static String KeyLogFtpServer="FtpServerHost";\r
+  final static String KeyLogFtpUser="FtpServerUser";\r
+  final static String KeyLogFtpPWD="FtpServerPWD";\r
+\r
+\r
+  final static String KeyWiFiSSID="WiFiSSID";\r
+  final static String KeyWiFiPasswd="WiFiPWD";\r
+\r
+\r
+  public static String getWiFiSSID(Context context){\r
+    return SharPreferenceUtil.getPrefString(context,KeyWiFiSSID,DefaultWiFiSSID);\r
+  }\r
+\r
+  public static void setWiFiSSID(Context context,String ssid){\r
+    SharPreferenceUtil.setPrefString(context,KeyWiFiSSID,ssid);\r
+  }\r
+\r
+  public static String getWiFiPasswd(Context context){\r
+    return SharPreferenceUtil.getPrefString(context,KeyWiFiPasswd,DefaultWiFiPWD);\r
+  }\r
+\r
+  public static void setWiFiPasswd(Context context,String pwd){\r
+    SharPreferenceUtil.setPrefString(context,KeyWiFiPasswd,pwd);\r
+  }\r
+\r
+\r
+  public static String getFtpUser(Context context){\r
+    return SharPreferenceUtil.getPrefString(context,KeyLogFtpUser,DefaultLogFtpUser);\r
+  }\r
+\r
+  public static void setFtpUser(Context context,String user){\r
+    SharPreferenceUtil.setPrefString(context,KeyLogFtpUser,user);\r
+  }\r
+\r
+  public static String getFtpServer(Context context){\r
+    return SharPreferenceUtil.getPrefString(context,KeyLogFtpServer,DefaultLogFtpServer);\r
+  }\r
+\r
+  public static void setFtpServer(Context context,String host){\r
+    SharPreferenceUtil.setPrefString(context,KeyLogFtpServer,host);\r
+  }\r
+\r
+  public static String getFtpPWD(Context context){\r
+    return SharPreferenceUtil.getPrefString(context,KeyLogFtpPWD,DefaultLogFtpPWD);\r
+  }\r
+  public static void setFtpPWD(Context context,String PWD){\r
+    SharPreferenceUtil.setPrefString(context,KeyLogFtpPWD,PWD);\r
+  }\r
+\r
+\r
+\r
+\r
+\r
   public static void setAlarmCycle(Context context, int cycle){\r
     SharPreferenceUtil.setPrefInt(context,KeyAlarmCycle,cycle);\r
   }\r
index a2ec87a..2e486a1 100644 (file)
@@ -20,7 +20,13 @@ import com.enqualcomm.support.utils.APNUtil;
 import com.enqualcomm.support.utils.DeviceInfoUtil;\r
 import com.enqualcomm.support.utils.Logger;\r
 import com.enqualcomm.support.utils.ServiceUtil;\r
+import com.enqualcomm.support.utils.TimeUtil;\r
+import com.enqualcomm.support.utils.Util;\r
+import com.enqualcomm.support.utils.ftpUtils;\r
 \r
+import java.io.File;\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
 import java.util.ArrayList;\r
 import java.util.Iterator;\r
 import java.util.concurrent.TimeUnit;\r
@@ -190,9 +196,9 @@ public class ICSmsManager {
                 Logger.i(sms + " len " + tmp.length);\r
                 if (tmp.length == 2) {\r
                     if (tmp[1].equals("reset#")) {\r
-                        Config.setProtocolServerHost(mContext, Runtime.DefaultHost);\r
-                        Config.setProtocolServerAddr(mContext, "", Runtime.DefaultPort);\r
-                        reply = "reset ServerIP to " + Runtime.DefaultHost + ":" + Runtime.DefaultPort + " success! ";\r
+                        Config.setProtocolServerHost(mContext, Config.DefaultHost);\r
+                        Config.setProtocolServerAddr(mContext, "", Config.DefaultPort);\r
+                        reply = "reset ServerIP to " + Config.DefaultHost + ":" + Config.DefaultPort + " success! ";\r
                         Config.loadServerSettings(runtime);\r
                         CoreService.getInstance().disconnect_server();\r
                         CoreService.getInstance().ReConnectToServer();\r
@@ -299,7 +305,121 @@ public class ICSmsManager {
                 } else {\r
                     sendSMS(phonenumber, "skipmovecheck format error!");\r
                 }\r
-            } else {\r
+            }else if(sms.startsWith("#connectwifi#=")){\r
+                String tmp[] = sms.split("=");\r
+                if (tmp.length == 2) {\r
+                    if (tmp[1].equals("current")) {\r
+                        sendSMS(phonenumber, "SkipMoveCheck " + LocationClient.getSkipMoveCheck() + "!");\r
+                    } else if (tmp[1].equals("reset")) {\r
+                        LocationClient.setSkipMoveCheck(true);\r
+                        sendSMS(phonenumber, "set SkipMoveCheck " + LocationClient.getSkipMoveCheck() + " success!");\r
+                    } else {\r
+\r
+\r
+                        sendSMS(phonenumber, "skipmovecheck format error!");\r
+                    }\r
+                } else {\r
+                    sendSMS(phonenumber, "skipmovecheck format error!");\r
+                }\r
+            }else if(sms.startsWith("#logctl#=")){\r
+                String tmp[] = sms.split("=");\r
+                if (tmp.length == 2) {\r
+                    if (tmp[1].equals("current")) {\r
+                        sendSMS(phonenumber, "Current FtpLogServer " + Config.getFtpServer(mContext) + ", user " + Config.getFtpUser(mContext) + ", pwd " + Config.getFtpPWD(mContext));\r
+                    }else  if (tmp[1].equals("reset")) {\r
+\r
+                        Config.setFtpServer(mContext, Config.DefaultLogFtpServer);\r
+                        Config.setFtpUser(mContext, Config.DefaultLogFtpUser);\r
+                        Config.setFtpPWD(mContext, Config.DefaultLogFtpPWD);\r
+                        sendSMS(phonenumber, "reset FtpLogServer to " + Config.getFtpServer(mContext) + ", user " + Config.getFtpUser(mContext) + ", pwd " + Config.getFtpPWD(mContext));\r
+                    }else if (tmp[1].startsWith("upload,")){\r
+\r
+                        String cmdl[] = tmp[1].split(",");\r
+                        if (cmdl.length == 2) {\r
+                            String logfile=cmdl[1];\r
+\r
+                            if (logfile.isEmpty()|| logfile.equals("all")){\r
+                                String filelist[]={"APILog","GPS","LocationAlarm","Battery","log"};\r
+//                                String filelist[]={"APILog","LocationAlarm","Battery"};\r
+                                String time=TimeUtil.getSystemTime3();\r
+                                StringBuilder sb=new StringBuilder();\r
+                                Observable.timer(500L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
+                                    public void call(Long param1Long) {\r
+                                        sendSMS(phonenumber, "start Upload allLogfile [APILog log GPS LocationAlarm Battery] to " + Config.getFtpServer(mContext));\r
+                                        for (String file : filelist) {\r
+\r
+                                            if (Util.LogfileExist(runtime, file)) {\r
+\r
+                                                String filepath = Util.getLogfilePath(runtime, file);\r
+                                                URL serverurl = null;\r
+                                                try {\r
+                                                    serverurl = new URL(Util.getServerLogfilePath(Config.getFtpServer(mContext), time, file));\r
+                                                } catch (MalformedURLException e) {\r
+                                                    e.printStackTrace();\r
+                                                }\r
+                                                if (ftpUtils.upload(serverurl, Config.getFtpUser(mContext), Config.getFtpPWD(mContext), new File(filepath))) {\r
+                                                    sb.append(" ").append(file);\r
+                                                    Logger.i("Upload file "+file+" success! ");\r
+                                                }else{\r
+                                                    Logger.i("Upload file "+file+" failed! ");\r
+\r
+                                                }\r
+\r
+\r
+                                            }\r
+                                        }\r
+\r
+                                        sendSMS(phonenumber, "Upload allLogfile [" + sb.toString() + "] to " + Config.getFtpServer(mContext));\r
+                                    }\r
+                                });\r
+                            }else{\r
+                                Observable.timer(500L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
+                                    public void call(Long param1Long) {\r
+                                        String filepath = Util.getLogfilePath(runtime, logfile);\r
+                                        URL serverurl = null;\r
+                                        try {\r
+                                            serverurl = new URL(Util.getServerLogfilePath(Config.getFtpServer(mContext), TimeUtil.getSystemTime3(), logfile));\r
+                                        } catch (MalformedURLException e) {\r
+                                            e.printStackTrace();\r
+                                        }\r
+                                        if (Util.LogfileExist(runtime, logfile)) {\r
+\r
+                                            sendSMS(phonenumber, "start Upload " + logfile + " to " + Config.getFtpServer(mContext) +" ...");\r
+                                            if( ftpUtils.upload(serverurl, Config.getFtpUser(mContext), Config.getFtpPWD(mContext), new File(filepath))) {\r
+                                                sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) +" success!");\r
+                                            }else{\r
+                                                sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) +" failed!");\r
+                                            }\r
+                                        } else {\r
+                                            sendSMS(phonenumber, logfile + " not exist !");\r
+                                        }\r
+                                    }\r
+                                });\r
+                            }\r
+\r
+//                            sendSMS(phonenumber, "upload FtpLogServer to " + Config.getFtpServer(mContext) + ", user " + Config.getFtpUser(mContext) + ", pwd " + Config.getFtpPWD(mContext));\r
+\r
+                        }else{\r
+                            sendSMS(phonenumber, "upload logfile format error!");\r
+                        }\r
+\r
+                    } else {\r
+                        String cmdl[] = tmp[1].split(",");\r
+                        if (cmdl.length == 3) {\r
+                            Config.setFtpServer(mContext,cmdl[0]);\r
+                            Config.setFtpUser(mContext,cmdl[1]);\r
+                            Config.setFtpPWD(mContext,cmdl[2]);\r
+                            sendSMS(phonenumber, "Set FtpLogServer to "+ Config.getFtpServer(mContext)+ ", user "+Config.getFtpUser(mContext)+", pwd "+Config.getFtpPWD(mContext));\r
+\r
+                        } else {\r
+                            sendSMS(phonenumber, "set LogFtpServer format error! "+sms);\r
+                        }\r
+                    }\r
+                } else {\r
+                    sendSMS(phonenumber, "set LogFtp ctl format error! "+sms);\r
+                }\r
+\r
+            }else {\r
                 return false;\r
             }\r
             return true;\r
index 8d0743e..7cdea9d 100644 (file)
@@ -58,9 +58,6 @@ public class Runtime {
   \r
   private String haveTry;\r
 \r
-  public static final String DefaultHost="watch.jiai.pro";\r
-  public static final int DefaultPort=8090;\r
-\r
   private String host = "watch.jiai.pro"; //118.178.155.223\r
 \r
   private String srvIP = "118.178.155.223";//"39.98.94.164";\r
index 385ea12..1737bcd 100644 (file)
@@ -15,6 +15,9 @@ import com.enqualcomm.support.adapter.protocolAPIHelper;
 import com.enqualcomm.support.bean.Runtime;\r
 \r
 import static android.content.Context.BATTERY_SERVICE;\r
+import static android.os.BatteryManager.EXTRA_LEVEL;\r
+import static android.os.BatteryManager.EXTRA_SCALE;\r
+import static android.os.BatteryManager.EXTRA_VOLTAGE;\r
 import static com.enqualcomm.support.Constants.ACTION_BATTERY_LOW_MSG;\r
 \r
 public class BatteryUtil {\r
@@ -27,9 +30,11 @@ public class BatteryUtil {
           } else {\r
             BatteryUtil.this.mRuntime.setBatterychanging(false);\r
           }\r
-          int i = param1Intent.getIntExtra("level", 0) * 100 / param1Intent.getIntExtra("scale", 100);\r
-          Logger.i("BatteryLevel "+i);\r
-          if (Config.LOG_TOFILE) FileOutputUtil.fileOutput(mRuntime.getCacheDir(),"Battery","BatteryLevel "+i);\r
+          int i = param1Intent.getIntExtra(EXTRA_LEVEL, 0) * 100 / param1Intent.getIntExtra(EXTRA_SCALE, 100);\r
+          // 当前电池电压\r
+          int batteryVolt = param1Intent.getIntExtra(EXTRA_VOLTAGE, -1);\r
+          Logger.i("BatteryLevel "+i + " BatteryVotage "+batteryVolt);\r
+          if (Config.LOG_TOFILE) FileOutputUtil.fileOutput(mRuntime.getCacheDir(),"Battery","BatteryLevel "+i + " BatteryVotage "+batteryVolt);\r
           if (i >= 100) {\r
             Runtime runtime = BatteryUtil.this.mRuntime;\r
             StringBuffer stringBuffer = BatteryUtil.this.mBuffer;\r
index 2614006..3a03e4c 100644 (file)
@@ -35,6 +35,12 @@ public class DeviceInfoUtil {
     return str2;\r
   }\r
 \r
+  public static String getModule(){\r
+\r
+    return Build.MODEL;\r
+  }\r
+\r
+\r
   /**\r
    * 得到当前应用版本名称的方法\r
    *\r
@@ -183,8 +189,9 @@ public class DeviceInfoUtil {
 \r
     SimSignalUtil sim=SimSignalUtil.getInstance(runtime.getContextProxy().context);\r
     return new StringBuilder()\r
-            .append(TimeUtil.getLocalTime2()).append(" ").append(DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context))\r
-            .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context)?"\n SIM ":" NoSIM ")\r
+            .append(TimeUtil.getLocalTime2()).append(" ").append(DeviceInfoUtil.getSWVersionDisplayName()).append("\n")\r
+            .append(DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context))\r
+            .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context)?" SIM ":" NoSIM ")\r
             .append(sim.getNetworkType()==SimSignalUtil.IS_2G?"2G":(sim.getNetworkType()==SimSignalUtil.IS_3G)?"3G":(sim.getNetworkType()==SimSignalUtil.IS_4G?"4G":"unknown"))\r
             .append(" [").append(runtime.getSignalStrength()).append(",Mini:").append(SimSignalUtil.getMinSignalStrength(sim.getNetworkType())).append("]")\r
             .append("\n KeepAlive ").append(KeepAlive.isConnected).append(" , HBcycle ").append(runtime.getHeartBeatCycle())\r
@@ -206,6 +213,7 @@ public class DeviceInfoUtil {
 \r
     SimSignalUtil sim=SimSignalUtil.getInstance(runtime.getContextProxy().context);\r
     return new StringBuilder()\r
+            .append(DeviceInfoUtil.getSWVersionDisplayName()).append("\n")\r
             .append(DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context))\r
             .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context)?" ":" NoSIM ")\r
             .append(sim.getNetworkType()==SimSignalUtil.IS_2G?"2G":(sim.getNetworkType()==SimSignalUtil.IS_3G)?"3G":(sim.getNetworkType()==SimSignalUtil.IS_4G?"4G":"unknown"))\r
index 88560fc..5bf8471 100644 (file)
@@ -29,6 +29,8 @@ import java.util.UUID;
 import okio.BufferedSink;\r
 import okio.Okio;\r
 import okio.Source;\r
+\r
+import com.enqualcomm.support.CoreService;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.bean.VoiceContent;\r
 import com.enqualcomm.support.bean.voicePacket;\r
@@ -365,7 +367,29 @@ public class Util {
     return 0;\r
   }\r
   \r
+  public static boolean LogfileExist(Runtime runtime,String logfilename){\r
+    return new File(getLogfilePath(runtime,logfilename)).exists();\r
+  }\r
 \r
+  public static String getLogfilePath(Runtime runtime,String logfilename){\r
+    StringBuilder stringBuilder = new StringBuilder();\r
+    stringBuilder.append(logfilename);\r
+    stringBuilder.append(".txt");\r
+    File file = new File(runtime.getCacheDir(), stringBuilder.toString());\r
+    return file.getAbsolutePath();\r
+  }\r
+\r
+  public static String getServerLogfilePath(String serverhost,String timefolder,String logfilename) {\r
+    StringBuilder urlbuilder=new StringBuilder();\r
+    urlbuilder.append("ftp://").append(serverhost).append("/")\r
+            .append("ftp/log/")\r
+            .append(DeviceInfoUtil.getModule()).append("/")\r
+            .append(DeviceInfoUtil.getSWVersionDisplayName()).append("/")\r
+            .append(CoreService.getInstance().getRuntime().IMEI()).append("/")\r
+            .append(timefolder);\r
+\r
+    return urlbuilder.toString();\r
+  }\r
   public static boolean isConnectWifi(Context paramContext) {\r
     ConnectivityManager connectivityManager = (ConnectivityManager)paramContext.getSystemService(CONNECTIVITY_SERVICE);\r
     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();\r
diff --git a/app/src/main/java/com/enqualcomm/support/utils/ftpUtils.java b/app/src/main/java/com/enqualcomm/support/utils/ftpUtils.java
new file mode 100644 (file)
index 0000000..23c4aa8
--- /dev/null
@@ -0,0 +1,316 @@
+package com.enqualcomm.support.utils;\r
+\r
+import com.sina.util.dnscache.log.FileUtil;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
+\r
+import it.sauronsoftware.ftp4j.FTPClient;\r
+import it.sauronsoftware.ftp4j.FTPFile;\r
+\r
+//uploadFolder(new URL("ftp://localhost:21/test/"), "admin", "123", new File("d:/test"));\r
+//downloadFolder(new URL("ftp://localhost:21/test/"), "admin", "123", new File("d:/dbtest"));\r
+\r
+\r
+\r
+public class ftpUtils {\r
+\r
+ ////   2. 共用方法\r
+\r
+  //  上传下载方法需要引用的方法:\r
+\r
+    public static URL newURL(URL parentUrl, String child)throws MalformedURLException {\r
+        String path = parentUrl.getPath();\r
+        if(!path.endsWith("/")){\r
+            path += "/";\r
+        }\r
+        path += child;\r
+        return new URL(parentUrl, path);\r
+    }\r
+\r
+//3. 下载文件\r
+\r
+    public static void download(URL url, String username, String password, File file){\r
+        download(url, username, password, "UTF-8", file);\r
+    }\r
+    public static void download(URL url, String username, String password, String encoding, File file){\r
+        FTPClient client = new FTPClient();\r
+        client.setCharset(encoding);\r
+        client.setType(FTPClient.TYPE_BINARY);\r
+        //连接到指定的FTP服务器(域名或IP) 不指定端口,则使用默认端口21\r
+        try {\r
+            int port = url.getPort();\r
+            if(port < 1){\r
+                port = 21;\r
+            }\r
+            client.connect(url.getHost(), port);\r
+            //登录验证\r
+            client.login(username, password);\r
+//            client.changeDirectory(url.getPath());\r
+            client.download(url.getFile(), file);\r
+            client.logout();\r
+            //安全退出\r
+            client.disconnect(true);\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+        }\r
+    }\r
+\r
+//4. 下载文件夹\r
+\r
+    public static void downloadFolder(URL url, String username, String password, File folder){\r
+        downloadFolder(url, username, password, "UTF-8", folder);\r
+    }\r
+    public static void downloadFolder(URL url, String username, String password, String encoding, File folder){\r
+        FTPClient client = new FTPClient();\r
+        client.setCharset(encoding);\r
+        client.setType(FTPClient.TYPE_BINARY);\r
+        //连接到指定的FTP服务器(域名或IP) 不指定端口,则使用默认端口21\r
+        try {\r
+            int port = url.getPort();\r
+            if(port < 1){\r
+                port = 21;\r
+            }\r
+            client.connect(url.getHost(), port);\r
+            //登录验证\r
+            client.login(username, password);\r
+            downloadFolder(client, url, folder);\r
+            client.logout();\r
+            //安全退出\r
+            client.disconnect(true);\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+        }\r
+    }\r
+    private static void downloadFolder(FTPClient client, URL url, File folder)throws Exception{\r
+        client.changeDirectory(url.getPath());\r
+        FTPFile[] ftpFiles = client.list();\r
+        if(!folder.exists()){\r
+            folder.mkdirs();\r
+        }\r
+        for(FTPFile ftpFile : ftpFiles){\r
+            String name = ftpFile.getName();\r
+            if(ftpFile.getType() == FTPFile.TYPE_FILE){\r
+                client.changeDirectory(url.getPath());\r
+                File f = new File(folder, name);\r
+                client.download(name, f);\r
+            }else if(ftpFile.getType() == FTPFile.TYPE_DIRECTORY){\r
+                downloadFolder(client, newURL(url, name), new File(folder, name));\r
+            }\r
+        }\r
+    }\r
+\r
+//5. 上传文件\r
+\r
+    public static boolean upload(URL url, String username, String password, File file){\r
+        return upload(url, username, password, "UTF-8", file);\r
+    }\r
+    public static boolean upload(URL url, String username, String password, String encoding, File file){\r
+        FTPClient client = new FTPClient();\r
+        client.setCharset(encoding);\r
+        client.setType(FTPClient.TYPE_AUTO);\r
+        client.setPassive(false);\r
+        //连接到指定的FTP服务器(域名或IP) 不指定端口,则使用默认端口21\r
+        try {\r
+            int port = url.getPort();\r
+            if(port < 1){\r
+                port = 21;\r
+            }\r
+            client.connect(url.getHost(), port);\r
+            //登录验证\r
+            client.login(username, password);\r
+\r
+            String folders[]=url.getPath().split("/");\r
+            String urlpath_tmp="";\r
+            URL urlTmp=null;\r
+            //遍历创建目录\r
+            for( String folder : folders) {\r
+                if(!folder.isEmpty()) {\r
+                    urlpath_tmp += "/" + folder;\r
+                    if (!existsFtpDir(client,folder)) {\r
+                        client.createDirectory(folder);\r
+                    }\r
+                    client.changeDirectory(urlpath_tmp);\r
+\r
+                }\r
+            }\r
+            client.changeDirectory(url.getPath());\r
+            client.upload(file);\r
+\r
+\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+            return false;\r
+        }\r
+\r
+        try{\r
+            client.logout();\r
+            //安全退出\r
+            client.disconnect(true);\r
+        }catch(Exception e){\r
+//            e.printStackTrace();\r
+        }\r
+        return true;\r
+\r
+    }\r
+\r
+//6. 上传文件夹\r
+\r
+    public static void uploadFolder(URL url, String username, String password, File folder){\r
+        uploadFolder(url, username, password, "UTF-8", folder);\r
+    }\r
+    public static void uploadFolder(URL url, String username, String password, String encoding, File folder){\r
+        FTPClient client = new FTPClient();\r
+        client.setCharset(encoding);\r
+        client.setType(FTPClient.TYPE_BINARY);\r
+        //连接到指定的FTP服务器(域名或IP) 不指定端口,则使用默认端口21\r
+        try {\r
+            int port = url.getPort();\r
+            if(port < 1){\r
+                port = 21;\r
+            }\r
+            client.connect(url.getHost(), port);\r
+            //登录验证\r
+            client.login(username, password);\r
+            client.changeDirectory(url.getPath());\r
+            String[] files = folder.list();\r
+            for(String file : files){\r
+                File f = new File(folder, file);\r
+                if(f.isDirectory()){\r
+                    uploadFolder(client, url, f);\r
+                }else{\r
+                    client.changeDirectory(url.getPath());\r
+                    client.upload(f);\r
+                }\r
+            }\r
+            client.logout();\r
+            //安全退出\r
+            client.disconnect(true);\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+        }\r
+    }\r
+    private static void uploadFolder(FTPClient client, URL parentUrl, File folder)throws Exception{\r
+        client.changeDirectory(parentUrl.getPath());\r
+        if(!existsFtpDir(client, folder.getName())){\r
+            client.createDirectory(folder.getName());\r
+        }\r
+        client.changeDirectory(folder.getName());\r
+\r
+        String[] fileList = folder.list();\r
+        if(fileList == null){\r
+            return ;\r
+        }\r
+\r
+        for(String file : fileList){\r
+            File f = new File(folder, file);\r
+            if(f.isDirectory()){\r
+                uploadFolder(client, newURL(parentUrl, folder.getName()), f);\r
+            }else if(f.isFile()){\r
+                client.changeDirectory(parentUrl.getPath());\r
+                client.changeDirectory(folder.getName());\r
+                client.upload(f);\r
+            }\r
+        }\r
+    }\r
+\r
+    private static boolean existsFtpDir(FTPClient client, String dir)throws Exception{\r
+        FTPFile[] ftpFiles = client.list();\r
+        for(FTPFile ftpFile : ftpFiles){\r
+            if((ftpFile.getType() == FTPFile.TYPE_DIRECTORY) && (dir.equals(ftpFile.getName()))){\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+\r
+//7. 判断是否存在文件或文件夹\r
+\r
+    public static boolean exists(URL url, String username, String password){\r
+        return exists(url, username, password, "UTF-8");\r
+\r
+    }\r
+    public static boolean exists(URL url, String username, String password, String encoding){\r
+        FTPClient client = new FTPClient();\r
+        client.setCharset(encoding);\r
+        client.setType(FTPClient.TYPE_AUTO);\r
+        client.setPassive(false);//设置被动模式 false\r
+\r
+        try {\r
+            int port = url.getPort();\r
+            if(port < 1){\r
+                port = 21;\r
+            }\r
+            String[] welcome = client.connect(url.getHost(), port);\r
+            Logger.i("welcome = " + welcome.length);\r
+            //登录验证\r
+            client.login(username, password);\r
+            String path = url.getPath();\r
+            Logger.i("path = " + path);\r
+            if(path.indexOf(".") != -1){//文件\r
+                int index = path.lastIndexOf("/");\r
+                String p = path.substring(0, index);\r
+                String f = path.substring(index + 1);\r
+                Logger.i("p = " + p + ", f = " + f);\r
+                client.changeDirectory(p);\r
+                FTPFile[] ftpFiles = client.list();\r
+                for(FTPFile ftpFile : ftpFiles){\r
+                    if((ftpFile.getType() == FTPFile.TYPE_FILE) && (ftpFile.getName().equals(f))){\r
+                        return true;\r
+                    }\r
+                }\r
+                return false;\r
+            }else{//文件夹\r
+                client.changeDirectory(path);\r
+            }\r
+            client.logout();\r
+            //安全退出\r
+            client.disconnect(true);\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+            return false;\r
+        }\r
+\r
+        return true;\r
+    }\r
+\r
+//8. FTP服务器之间复制文件夹\r
+\r
+    public static void copyFolder(URL sourceUrl, String sourceUsername, String sourcePassword, String sourceEncoding, URL destUrl, String destUsername, String destPassword, String destEncoding, String tmpDir)throws IOException {\r
+        downloadFolder(sourceUrl, sourceUsername, sourcePassword, sourceEncoding, new File(tmpDir));\r
+        uploadFolder(destUrl, destUsername, destPassword, destEncoding, new File(tmpDir));\r
+        FileUtil.deleteFolder(tmpDir); //待实现\r
+    }\r
+    public static void copyFolder(URL sourceUrl, String sourceUsername, String sourcePassword, URL destUrl, String destUsername, String destPassword, String tmpDir)throws IOException{\r
+        copyFolder(sourceUrl, sourceUsername, sourcePassword, "UTF-8", destUrl, destUsername, destPassword, "UTF-8", tmpDir);\r
+    }\r
+\r
+//9.删除文件\r
+\r
+    public static void delete(URL url, String username, String password){\r
+        delete(url, username, password, "UTF-8");\r
+    }\r
+    public static void delete(URL url, String username, String password, String encoding){\r
+        FTPClient client = new FTPClient();\r
+        client.setCharset(encoding);\r
+        client.setType(FTPClient.TYPE_BINARY);\r
+        //连接到指定的FTP服务器(域名或IP) 不指定端口,则使用默认端口21\r
+        try {\r
+            int port = url.getPort();\r
+            if(port < 1){\r
+                port = 21;\r
+            }\r
+            client.connect(url.getHost(), port);\r
+            //登录验证\r
+            client.login(username, password);\r
+            client.deleteFile(url.getPath());\r
+            client.logout();\r
+            //安全退出\r
+            client.disconnect(true);\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+        }\r
+    }\r
+}\r
index ced07e9..0bf5082 100644 (file)
@@ -121,4 +121,9 @@ public class FileUtil {
             }
         }
     }
+
+    public static void deleteFolder(String tmpDir) {
+
+
+    }
 }