| package com.doumee.core.utils; | 
|   | 
| import com.doumee.core.constants.Constants; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.apache.commons.net.PrintCommandListener; | 
| import org.apache.commons.net.ftp.FTP; | 
| import org.apache.commons.net.ftp.FTPClient; | 
| import org.apache.commons.net.ftp.FTPFile; | 
| import org.apache.commons.net.ftp.FTPReply; | 
| //import org.apache.http.client.methods.CloseableHttpResponse; | 
| //import org.apache.http.client.methods.HttpGet; | 
| //import org.apache.http.impl.client.CloseableHttpClient; | 
| //import org.apache.http.impl.client.HttpClientBuilder; | 
| //import org.apache.http.util.EntityUtils; | 
|   | 
| import java.io.*; | 
| import java.net.HttpURLConnection; | 
| import java.net.MalformedURLException; | 
| import java.net.URL; | 
| import java.util.Date; | 
| import java.util.UUID; | 
|   | 
| /** */ | 
| /** | 
|  * 支持断点续传的FTP实用类 | 
|  * | 
|  * @author BenZhou http://www.bt285.cn | 
|  * @version 0.1 实现基本断点上传下载 | 
|  * @version 0.2 实现上传下载进度汇报 | 
|  * @version 0.3 实现中文目录创建及中文文件创建,添加对于中文的支持 | 
|  */ | 
| @Slf4j | 
| public class FtpUtil { | 
|     public FTPClient ftpClient = new FTPClient(); | 
|     public static String hostname; | 
|     public static int port; | 
|     public static String username; | 
|     public static  String password; | 
|   | 
|     public FtpUtil() { | 
|         // 设置将过程中使用到的命令输出到控制台 | 
|         this.ftpClient.addProtocolCommandListener(new PrintCommandListener( | 
|                 new PrintWriter(System.out))); | 
|     } | 
|   | 
|     public FtpUtil(String hostname, int port, String username, String password) | 
|             throws IOException { | 
|         // 设置将过程中使用到的命令输出到控制台 | 
|         FtpUtil.hostname =hostname; | 
|         FtpUtil.port =port; | 
|         FtpUtil.username =username; | 
|         FtpUtil.password =password; | 
|         connect(); | 
|     } | 
|     /** | 
|      * 初始化ftp服务器 | 
|      */ | 
|     public boolean connect() { | 
|         boolean flag = false; | 
|         try { | 
|             System.out.println("connecting...ftp服务器:"+this.hostname+":"+this.port); | 
|             ftpClient.setRemoteVerificationEnabled(false); | 
|             ftpClient.connect(hostname, port); //连接ftp服务器 | 
|             ftpClient.login(username, password); //登录ftp服务器 | 
| //            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) { | 
| //                LOCAL_CHARSET = "UTF-8"; | 
| //            } | 
|             ftpClient.setControlEncoding("GBK"); | 
|             ftpClient.enterLocalPassiveMode(); | 
|             int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器 | 
|             if(!FTPReply.isPositiveCompletion(replyCode)){ | 
|                 log.error("connect failed...ftp服务器:"+this.hostname+":"+this.port+"返回码:"+replyCode); | 
|             }else { | 
|                 flag = true; | 
|                 log.info("connect successful...ftp服务器:"+this.hostname+":"+this.port+"返回码:"+replyCode); | 
|             } | 
|         }catch (MalformedURLException e) { | 
|             e.printStackTrace(); | 
|             log.error("connect exception...ftp服务器:"+this.hostname+":"+this.port+    e.getMessage()); | 
|         }catch (IOException e) { | 
|             e.printStackTrace(); | 
|             log.error("connect exception...ftp服务器:"+this.hostname+":"+this.port+    e.getMessage()); | 
|         } | 
|         return flag; | 
|     } | 
|   | 
|     /** */ | 
|     /** | 
|      * 连接到FTP服务器 | 
|      * | 
|      *            密码 | 
|      * @return 是否连接成功 | 
|      * @throws IOException | 
|      */ | 
|     public boolean connect2() throws IOException { | 
|         ftpClient.connect(hostname, port); | 
|         ftpClient.setControlEncoding("GBK"); | 
|         if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { | 
|             if (ftpClient.login(username, password)) { | 
|                 return true; | 
|             } | 
|         } | 
|         disconnect(); | 
|         return false; | 
|     } | 
|   | 
|     /** */ | 
|     /** | 
|      * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 | 
|      * | 
|      * @param remote | 
|      *            远程文件路径 | 
|      * @param local | 
|      *            本地文件路径 | 
|      * @return 上传的状态 | 
|      * @throws IOException | 
|      */ | 
|     public String download(String remote, String local) throws IOException { | 
|         // 设置被动模式 | 
|         ftpClient.enterLocalPassiveMode(); | 
|         // 设置以二进制方式传输 | 
|         ftpClient.setFileType(FTP.BINARY_FILE_TYPE); | 
|   | 
|         String result; | 
|   | 
|         // 检查远程文件是否存在 | 
|         FTPFile[] files = ftpClient.listFiles(new String( | 
|                 remote.getBytes("GBK"), "iso-8859-1")); | 
|         if (files.length != 1) { | 
|             // System.out.println("远程文件不存在"); | 
|             return "远程文件不存在"; | 
|         } | 
|   | 
|         long lRemoteSize = files[0].getSize(); | 
|         File f = new File(local); | 
|         // 本地存在文件,进行断点下载 | 
|         if (f.exists()) { | 
|             long localSize = f.length(); | 
|             // 判断本地文件大小是否大于远程文件大小 | 
|             if (localSize >= lRemoteSize) { | 
|                 // System.out.println("本地文件大于远程文件,下载中止"); | 
|                 // return "本地文件大于远程文件,下载中止"; | 
|             } | 
|   | 
|             // 进行断点续传,并记录状态 | 
|             FileOutputStream out = new FileOutputStream(f, true); | 
|             ftpClient.setRestartOffset(localSize); | 
|             InputStream in = ftpClient.retrieveFileStream(new String(remote | 
|                     .getBytes("GBK"), "iso-8859-1")); | 
|             byte[] bytes = new byte[1024]; | 
|             long step = lRemoteSize / 100; | 
|             long process = localSize / step; | 
|             int c; | 
|             while ((c = in.read(bytes)) != -1) { | 
|                 out.write(bytes, 0, c); | 
|                 localSize += c; | 
|                 long nowProcess = localSize / step; | 
|                 if (nowProcess > process) { | 
|                     process = nowProcess; | 
|                     if (process % 10 == 0) | 
|                         System.out.println("下载进度:" + process); | 
|                     // TODO 更新文件下载进度,值存放在process变量中 | 
|                 } | 
|             } | 
|             in.close(); | 
|             out.close(); | 
|             boolean isDo = ftpClient.completePendingCommand(); | 
|             if (isDo) { | 
|                 result = "300"; | 
|                 // result = DownloadStatus.Download_From_Break_Success; | 
|             } else { | 
|                 result = "400"; | 
|                 // result = DownloadStatus.Download_From_Break_Failed; | 
|             } | 
|         } else { | 
|             OutputStream out = new FileOutputStream(f); | 
|             InputStream in = ftpClient.retrieveFileStream(new String(remote | 
|                     .getBytes("GBK"), "iso-8859-1")); | 
|             byte[] bytes = new byte[1024]; | 
|             long step = lRemoteSize / 100; | 
|             long process = 0; | 
|             long localSize = 0L; | 
|             int c; | 
|             while ((c = in.read(bytes)) != -1) { | 
|                 out.write(bytes, 0, c); | 
|                 localSize += c; | 
|                 long nowProcess = localSize / step; | 
|                 if (nowProcess > process) { | 
|                     process = nowProcess; | 
|                     if (process % 10 == 0) | 
|                         System.out.println("下载进度:" + process); | 
|                     // TODO 更新文件下载进度,值存放在process变量中 | 
|                 } | 
|             } | 
|             in.close(); | 
|             out.close(); | 
|             boolean upNewStatus = ftpClient.completePendingCommand(); | 
|             if (upNewStatus) { | 
|                 result = "500"; | 
|                 // result = DownloadStatus.Download_New_Success; | 
|             } else { | 
|                 // result = DownloadStatus.Download_New_Failed; | 
|                 result = "600"; | 
|             } | 
|         } | 
|         return result; | 
|     } | 
|   | 
|     /** */ | 
|     /** | 
|      * 上传文件到FTP服务器,支持断点续传 | 
|      * | 
|      * @param local | 
|      *            本地文件名称,绝对路径 | 
|      * @param remote | 
|      *            远程文件路径,使用/home/directory1/subdirectory/file.ext或是 | 
|      *            http://www.guihua.org /subdirectory/file.ext | 
|      *            按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 | 
|      * @return 上传结果 | 
|      * @throws IOException | 
|      */ | 
|     public String upload(String local, String remote) throws IOException { | 
|         // 设置PassiveMode传输 | 
|         ftpClient.enterLocalPassiveMode(); | 
|   | 
|         // 设置以二进制流的方式传输 | 
|         ftpClient.setFileType(FTP.BINARY_FILE_TYPE); | 
|         ftpClient.setControlEncoding("GBK"); | 
|         String result; | 
|         // 对远程目录的处理 | 
|         String remoteFileName = remote; | 
|         if (remote.contains(File.separator)) { | 
|             remoteFileName = remote.substring(remote.lastIndexOf(File.separator) + 1); | 
|             // 创建服务器远程目录结构,创建失败直接返回 | 
|             if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) { | 
|                 return "2"; | 
|             } | 
|         } | 
|   | 
|      // 检查远程是否存在文件 | 
|         FTPFile[] files = ftpClient.listFiles(new String(remoteFileName | 
|                 .getBytes("GBK"), "iso-8859-1")); | 
|         if (files.length == 1) { | 
|             long remoteSize = files[0].getSize(); | 
|             File f = new File(local); | 
|             long localSize = f.length(); | 
|             if (remoteSize == localSize) { | 
|                 return "700"; | 
|                 // return UploadStatus.File_Exits; | 
|             } else if (remoteSize > localSize) { | 
|                 return "800"; | 
|                 // return UploadStatus.Remote_Bigger_Local; | 
|             } | 
|   | 
|             // 尝试移动文件内读取指针,实现断点续传 | 
|             result = uploadFile(remoteFileName, f, ftpClient, remoteSize); | 
|   | 
|             // 如果断点续传没有成功,则删除服务器上文件,重新上传 | 
|             if (StringUtils.equals(result, "1")) { | 
|                 if (!ftpClient.deleteFile(remoteFileName)) { | 
|                     return "1"; | 
|                 } | 
|                 result = uploadFile(remoteFileName, f, ftpClient, 0); | 
|             } | 
|         } else { | 
|             result = uploadFile(remoteFileName, new File(local), ftpClient, 0); | 
|         } | 
|         return result; | 
|     } | 
|     public boolean uploadInputstream(InputStream inputStream, String remote)  { | 
|         // 设置PassiveMode传输 | 
|         Date d1 = new Date(); | 
|         log.error("上传文件成功=============开始========="+DateUtil.getPlusTime2(d1)); | 
|         try { | 
|             ftpClient.enterLocalPassiveMode(); | 
|             // 设置以二进制流的方式传输 | 
|             ftpClient.setFileType(FTP.BINARY_FILE_TYPE); | 
|             ftpClient.setControlEncoding("GBK"); | 
|             // 对远程目录的处理 | 
|             String remoteFileName = remote; | 
|             if (remote.contains("/")) { | 
|                 remoteFileName = remote.substring(remote.lastIndexOf("/") + 1); | 
|                 // 创建服务器远程目录结构,创建失败直接返回 | 
|                 if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) { | 
|                     log.error("创建ftp目录失败======================="+remote); | 
|                     return false; | 
|                 } | 
|             } | 
|             boolean result = ftpClient.storeFile(remoteFileName, inputStream); | 
|             inputStream.close(); | 
|             ftpClient.logout(); | 
|             if(result){ | 
|                 log.info("上传文件成功======================"+remote); | 
|             }else{ | 
|                 log.error("上传文件失败======================="+remote); | 
|             } | 
|             Date d2= new Date(); | 
|             log.error("上传文件成功=============结束========="+DateUtil.getPlusTime2(d2) +"耗时毫秒:"+( (d2.getTime()-d1.getTime())  )); | 
|             return result; | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|             log.error("上传文件失败======================="+remote); | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     public boolean uploadInputstreamBatch(InputStream inputStream, String remote, Boolean close , Integer index )  { | 
|         // 设置PassiveMode传输 | 
|         try { | 
|             ftpClient.enterLocalPassiveMode(); | 
|             // 设置以二进制流的方式传输 | 
|             ftpClient.setFileType(FTP.BINARY_FILE_TYPE); | 
|             ftpClient.setControlEncoding("GBK"); | 
|             // 对远程目录的处理 | 
|             String remoteFileName = remote; | 
|             if (remote.contains("/")) { | 
|                 remoteFileName = remote.substring(remote.lastIndexOf("/") + 1); | 
|                 // 创建服务器远程目录结构,创建失败直接返回 | 
|                 if (Constants.equalsInteger(index,Constants.ONE) && StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) { | 
|                     log.error("创建ftp目录失败======================="+remote); | 
|                     return false; | 
|                 } | 
|             } | 
|             boolean result = ftpClient.storeFile(remoteFileName, inputStream); | 
|             inputStream.close(); | 
|             if(close){ | 
|                 ftpClient.logout(); | 
|             } | 
|             if(result){ | 
|                 log.info("上传文件成功======================"+remote); | 
|             }else{ | 
|                 log.error("上传文件失败======================="+remote); | 
|             } | 
|             return result; | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|             log.error("上传文件失败======================="+remote); | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     public int getNumFromStr(String str,char searchstr) { | 
|         int count = 0; | 
|         char[] charArray = str.toCharArray(); | 
|         for (char param : charArray) { | 
|             if (param == searchstr) { | 
|                 count++; | 
|             } | 
|         } | 
|         return count; | 
|     } | 
|     /** */ | 
|     /** | 
|      * 上传文件到FTP服务器,支持断点续传 | 
|      * | 
|      * @param localFile | 
|      *            本地文件流 | 
|      * @param remote | 
|      *            远程文件路径,使用/home/directory1/subdirectory/file.ext或是 | 
|      *            http://www.guihua.org /subdirectory/file.ext | 
|      *            按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 | 
|      * @return 上传结果 | 
|      * @throws IOException | 
|      */ | 
|     public String uploadFile(File localFile, String remote) throws IOException { | 
|         // 设置PassiveMode传输 | 
|         ftpClient.enterLocalPassiveMode(); | 
|         // 设置以二进制流的方式传输 | 
|         ftpClient.setFileType(FTP.BINARY_FILE_TYPE); | 
|         ftpClient.setControlEncoding("GBK"); | 
|         String result; | 
|         // 对远程目录的处理 | 
|         String remoteFileName = remote ; | 
|          if (remote.contains("/")) { | 
|             remoteFileName = remote.substring(remote.lastIndexOf("/") + 1); | 
|             // 创建服务器远程目录结构,创建失败直接返回 | 
|             if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) { | 
|                 return "2"; | 
|             } | 
|         } | 
|   | 
|         // 检查远程是否存在文件 | 
|         FTPFile[] files = ftpClient.listFiles(new String(remoteFileName | 
|                 .getBytes("GBK"), "iso-8859-1")); | 
|         if (files.length == 1) { | 
|             long remoteSize = files[0].getSize(); | 
|   | 
|             long localSize = localFile.length(); | 
|             if (remoteSize == localSize) { | 
|                 return "700"; | 
|                 // return UploadStatus.File_Exits; | 
|             } else if (remoteSize > localSize) { | 
|                 return "800"; | 
|                 // return UploadStatus.Remote_Bigger_Local; | 
|             } | 
|   | 
|             // 尝试移动文件内读取指针,实现断点续传 | 
|             result = uploadFile(remoteFileName, localFile, ftpClient, | 
|                     remoteSize); | 
|   | 
|             // 如果断点续传没有成功,则删除服务器上文件,重新上传 | 
|             if (StringUtils.equals(result, "1")) { | 
|                 if (!ftpClient.deleteFile(remoteFileName)) { | 
|                     return "1"; | 
|                 } | 
|                 result = uploadFile(remoteFileName, localFile, ftpClient, 0); | 
|             } | 
|             // if (result == UploadStatus.Upload_From_Break_Failed) { | 
|             // if (!ftpClient.deleteFile(remoteFileName)) { | 
|             // return UploadStatus.Delete_Remote_Faild; | 
|             // } | 
|             // result = uploadFile(remoteFileName, f, ftpClient, 0); | 
|             // } | 
|         } else { | 
|             result = uploadFile(remoteFileName, localFile, ftpClient, 0); | 
|         } | 
|   | 
|         return result; | 
|     } | 
|   | 
|     /** */ | 
|     /** | 
|      * 断开与远程服务器的连接 | 
|      * | 
|      * @throws IOException | 
|      */ | 
|     public void disconnect() throws IOException { | 
|         if (ftpClient.isConnected()) { | 
|             ftpClient.disconnect(); | 
|         } | 
|     } | 
|   | 
|     /** */ | 
|     /** | 
|      * 递归创建远程服务器目录 | 
|      * | 
|      * @param remote | 
|      *            远程服务器文件绝对路径 | 
|      * @param ftpClient | 
|      *            FTPClient对象 | 
|      * @return 目录创建是否成功 | 
|      * @throws IOException | 
|      */ | 
|     public String CreateDirecroty(String remote, FTPClient ftpClient) | 
|             throws IOException { | 
|         String status = "1"; | 
|         // UploadStatus status = UploadStatus.Create_Directory_Success; | 
|         String directory = remote.substring(0, remote.lastIndexOf("/") + 1); | 
|         if (!directory.equalsIgnoreCase("/") | 
|                 && !ftpClient.changeWorkingDirectory(new String(directory | 
|                 .getBytes("GBK"), "iso-8859-1"))) { | 
|             // 如果远程目录不存在,则递归创建远程服务器目录 | 
|             int start = 0; | 
|             int end = 0; | 
|             if (directory.startsWith("/")) { | 
|                 start = 1; | 
|             } else { | 
|                 start = 0; | 
|             } | 
|             end = directory | 
|                     .indexOf("/", start); | 
|             while (true) { | 
|                 String subDirectory = new String(remote.substring(start, end) | 
|                         .getBytes("GBK"), "iso-8859-1"); | 
|                 if (!ftpClient.changeWorkingDirectory(subDirectory)) { | 
|                     if (ftpClient.makeDirectory(subDirectory)) { | 
|                         ftpClient.changeWorkingDirectory(subDirectory); | 
|                     } else { | 
|                         System.out.println("创建目录失败"); | 
|                         return "2"; | 
|                         // return UploadStatus.Create_Directory_Fail; | 
|                     } | 
|                 } | 
|   | 
|                 start = end + 1; | 
|                 end = directory.indexOf("/", | 
|                         start); | 
|   | 
|                 // 检查所有目录是否创建完毕 | 
|                 if (end <= start) { | 
|                     break; | 
|                 } | 
|             } | 
|         } | 
|         return status; | 
|     } | 
|   | 
|     /** | 
|      * 上传文件到服务器,新上传和断点续传 | 
|      * | 
|      * @param remoteFile | 
|      *            远程文件名,在上传之前已经将服务器工作目录做了改变 | 
|      * @param localFile | 
|      *            本地文件File句柄,绝对路径 | 
|      *            需要显示的处理进度步进值 | 
|      * @param ftpClient | 
|      *            FTPClient引用 | 
|      * @return | 
|      * @throws IOException | 
|      */ | 
|     public String uploadFile(String remoteFile, File localFile, | 
|             FTPClient ftpClient, long remoteSize) throws IOException { | 
|         String status; | 
|         // 显示进度的上传 | 
|         long step = localFile.length() / 100; | 
|         step=step ==0?1:step; | 
|         long process = 0; | 
|         long localreadbytes = 0L; | 
| //        System.out.println(remoteFile +"-------------------------"+localFile.getPath().toString()); | 
|         RandomAccessFile raf = new RandomAccessFile(localFile, "r"); | 
|         OutputStream out = ftpClient.appendFileStream(new String(remoteFile | 
|                 .getBytes("GBK"), "iso-8859-1")); | 
|         // 断点续传 | 
|         if (remoteSize > 0) { | 
|             ftpClient.setRestartOffset(remoteSize); | 
|             process = remoteSize / step; | 
|             raf.seek(remoteSize); | 
|             localreadbytes = remoteSize; | 
|         } | 
|         byte[] bytes = new byte[1024]; | 
|         int c; | 
|         while ((c = raf.read(bytes)) != -1) { | 
|             out.write(bytes, 0, c); | 
|             localreadbytes += c; | 
|             if (localreadbytes / step != process) { | 
|                 process = localreadbytes / step; | 
|                 System.out.println("上传进度:" + process); | 
|                 // TODO 汇报上传状态 | 
|             } | 
|         } | 
|         out.flush(); | 
|         raf.close(); | 
|         out.close(); | 
|         boolean result = ftpClient.completePendingCommand(); | 
|         if (remoteSize > 0) { | 
|             status = result ? "0" : "1"; | 
|             // status = result ? UploadStatus.Upload_From_Break_Success | 
|             // : UploadStatus.Upload_From_Break_Failed; | 
|         } else { | 
|             status = result ? "0" : "1"; | 
|             // status = result ? UploadStatus.Upload_New_File_Success | 
|             // : UploadStatus.Upload_New_File_Failed; | 
|         } | 
|         return status; | 
|     } | 
|   | 
|     public byte[] getOnlineInputsteam(String urlStr){ | 
|         try { | 
|             // 图片的 URL | 
|             URL url = new URL(urlStr); | 
|             HttpURLConnection connection = (HttpURLConnection) url.openConnection(); | 
|             connection.setRequestMethod("GET"); | 
|             connection.setDoInput(true); | 
|             connection.connect(); | 
|             // 获取输入流,用于读取数据 | 
|             InputStream inputStream = connection.getInputStream(); | 
|             ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); | 
|             byte[] buffer = new byte[4096]; // 缓冲区大小,可以根据需要调整 | 
|             int bytesRead; | 
|             while ((bytesRead = inputStream.read(buffer)) != -1) { | 
|                 outputStream.write(buffer, 0, bytesRead); | 
|             } | 
|             outputStream.close(); | 
|             inputStream.close(); | 
|             connection.disconnect(); | 
|   | 
|             // 获取字节数组 | 
|             byte[] imageBytes = outputStream.toByteArray(); | 
|             System.out.println("Image size: " + imageBytes.length + " bytes"); | 
|             return imageBytes; | 
|         } catch (Exception e) { | 
|             log.error("获取图片异常:{}",e.getMessage()); | 
|         } | 
|         return  null; | 
|     } | 
|     public boolean uploadOnlineFile(String url,String ftpPath, String fileName) throws Exception | 
|     { | 
|         byte[] buf = getOnlineInputsteam(url); | 
|         if(buf == null){ | 
|             return  false; | 
|         } | 
|         try | 
|         { | 
|             ftpClient.enterLocalPassiveMode();// 开启被动模式 | 
|             ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); | 
|             CreateDirecroty( ftpPath,ftpClient); | 
|             String printWorkingDirectory = ftpClient.printWorkingDirectory(); | 
|             System.out.println("获取当前目录:" + printWorkingDirectory); | 
|             boolean flag = ftpClient.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1"), new ByteArrayInputStream(buf)); | 
|             // 通过发送 QUIT 命令注销 FTP 服务器 | 
|             ftpClient.logout(); | 
|             return  flag; | 
|         } | 
|         catch (Exception e) | 
|         { | 
|             e.printStackTrace(); | 
|         } | 
|         finally | 
|         { | 
|             if (ftpClient.isConnected()){ | 
|                     ftpClient.disconnect(); | 
|             } | 
|   | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     /** | 
|      * 删除一个文件 | 
|      */ | 
|     public boolean deleteFile(String filename) { | 
|         boolean flag = true; | 
|         try { | 
|   | 
|             flag = ftpClient.deleteFile(filename); | 
|             if (flag) { | 
|                 System.out.println("删除文件成功!"); | 
|             } else { | 
|                 System.out.println("删除文件失败!"); | 
|             } | 
|         } catch (IOException ioe) { | 
|             ioe.printStackTrace(); | 
|         } | 
|         return flag; | 
|     } | 
|   | 
|     public static void main(String[] args) throws Exception { | 
|         try { | 
|             FtpUtil ftpUtil = new FtpUtil("175.27.187.84", 21, "ftpuser","doumee168" ); | 
|             ftpUtil.uploadOnlineFile("https://profile-avatar.csdnimg.cn/default.jpg!1", "test"+"/", UUID.randomUUID().toString()+"test.jpg"); | 
|             /*FtpUtil myFtp = new FtpUtil("106.15.54.228", 21, "ftptlg", | 
|                     "tlg168.com"); | 
|             System.out.println(myFtp.upload("D:\\devices.sql", "/1111/devices.sql")); | 
|   | 
|             // myFtp.ftpClient.makeDirectory(new String("电视剧".getBytes("GBK"), | 
|             // "iso-8859-1")); | 
|             // myFtp.ftpClient.changeWorkingDirectory(new String("电视剧" | 
|             // .getBytes("GBK"), "iso-8859-1")); | 
|             // myFtp.ftpClient.makeDirectory(new String("走西口".getBytes("GBK"), | 
|             // "iso-8859-1")); | 
|             // System.out.println(myFtp.upload("http://www.5a520.cn /yw.flv", | 
|             // "/yw.flv", 5)); | 
|             // System.out.println(myFtp.upload("http://www.5a520.cn /走西口24.mp4", | 
|             // "/央视走西口/新浪网/走西口24.mp4")); | 
|             *//** | 
|              * t.connect("pengtu", "61.191.61.226", 2122, "yangnet", | 
|              * "yanglong@doumee.com"); File file = new File( | 
|              * "D:\\lib/commons-net-3.3-bin/commons-net-3.3/NOTICE.txt"); | 
|              * | 
|              * | 
|              *//* | 
|   | 
|             System.out.println(myFtp.download("/1/2/NOTICE.txt", "D:\\哈.txt")); | 
|   | 
|             myFtp.deleteFile("/1/2/NOTICE.txt"); | 
|             myFtp.disconnect(); | 
|   | 
|             System.out.println("java版本号:" + System.getProperty("java.version")); // java版本号 | 
|             System.out | 
|                     .println("Java提供商名称:" + System.getProperty("java.vendor")); // Java提供商名称 | 
|             System.out.println("Java提供商网站:" | 
|                     + System.getProperty("java.vendor.url")); // Java提供商网站 | 
|             System.out.println("jre目录:" + System.getProperty("java.home")); // Java,哦,应该是jre目录 | 
|             System.out.println("Java虚拟机规范版本号:" | 
|                     + System.getProperty("java.vm.specification.version")); // Java虚拟机规范版本号 | 
|             System.out.println("Java虚拟机规范提供商:" | 
|                     + System.getProperty("java.vm.specification.vendor")); // Java虚拟机规范提供商 | 
|             System.out.println("Java虚拟机规范名称:" | 
|                     + System.getProperty("java.vm.specification.name")); // Java虚拟机规范名称 | 
|             System.out.println("Java虚拟机版本号:" | 
|                     + System.getProperty("java.vm.version")); // Java虚拟机版本号 | 
|             System.out.println("Java虚拟机提供商:" | 
|                     + System.getProperty("java.vm.vendor")); // Java虚拟机提供商 | 
|             System.out.println("Java虚拟机名称:" | 
|                     + System.getProperty("java.vm.name")); // Java虚拟机名称 | 
|             System.out.println("Java规范版本号:" | 
|                     + System.getProperty("java.specification.version")); // Java规范版本号 | 
|             System.out.println("Java规范提供商:" | 
|                     + System.getProperty("java.specification.vendor")); // Java规范提供商 | 
|             System.out.println("Java规范名称:" | 
|                     + System.getProperty("java.specification.name")); // Java规范名称 | 
|             System.out.println("Java类版本号:" | 
|                     + System.getProperty("java.class.version")); // Java类版本号 | 
|             System.out.println("Java类路径:" | 
|                     + System.getProperty("java.class.path")); // Java类路径 | 
|             System.out.println("Java lib路径:" | 
|                     + System.getProperty("java.library.path")); // Java lib路径 | 
|             System.out.println("Java输入输出临时路径:" | 
|                     + System.getProperty("java.io.tmpdir")); // Java输入输出临时路径 | 
|             System.out | 
|                     .println("Java编译器:" + System.getProperty("java.compiler")); // Java编译器 | 
|             System.out.println("Java执行路径:" | 
|                     + System.getProperty("java.ext.dirs")); // Java执行路径 | 
|             System.out.println("操作系统名称:" + System.getProperty("os.name")); // 操作系统名称 | 
|             System.out.println("操作系统的架构:" + System.getProperty("os.arch")); // 操作系统的架构 | 
|             System.out.println("操作系统版本号:" + System.getProperty("os.version")); // 操作系统版本号 | 
|             System.out.println("文件分隔符:" + System.getProperty("file.separator")); // 文件分隔符 | 
|             System.out.println("路径分隔符:" + System.getProperty("path.separator")); // 路径分隔符 | 
|             System.out.println("直线分隔符:" + System.getProperty("line.separator")); // 直线分隔符 | 
|             System.out.println("操作系统用户名:" + System.getProperty("user.name")); // 用户名 | 
|             System.out.println("操作系统用户的主目录:" + System.getProperty("user.home")); // 用户的主目录 | 
|             System.out.println("当前程序所在目录:" + System.getProperty("user.dir")); // 当前程序所在目录*/ | 
|   | 
|         } catch (IOException e) { | 
|             System.out.println("连接FTP出错:" + e.getMessage()); | 
|         } | 
|     } | 
|   | 
|     /*** | 
|      * @上传文件夹 | 
|      * @param localDirectory | 
|      *            当地文件夹 | 
|      * @param remoteDirectoryPath | 
|      *            Ftp 服务器路径 以目录File.separator结束 | 
|      * */ | 
|     public boolean uploadDirectory(String localDirectory, | 
|             String remoteDirectoryPath) throws Exception { | 
|         File src = new File(localDirectory); | 
|         try { | 
|             remoteDirectoryPath =  remoteDirectoryPath  + "/"; | 
|             boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath); | 
|         }catch (IOException e) { | 
|             e.printStackTrace(); | 
|             log.info(remoteDirectoryPath + "目录创建失败"); | 
|             return false; | 
|         } | 
|         File[] allFile = src.listFiles(); | 
|         for (int currentFile = 0;currentFile < allFile.length;currentFile++) { | 
|             File f =allFile[currentFile]; | 
|             String srcName=    f.getPath().toString(); | 
|             String tPath = remoteDirectoryPath+f.getName(); | 
|             if (!f.isDirectory()) { | 
|   | 
|                 int dNum = getNumFromStr(tPath,"/".toCharArray()[0]); | 
|                 uploadFile(f, tPath); | 
|                 if(dNum -2>=0){ | 
|                     for (int i = 0; i < dNum-1; i++) { | 
|                         this.ftpClient.changeToParentDirectory(); | 
|                     } | 
|                 } | 
|             }else{ | 
|                 uploadDirectory(srcName, | 
|                         tPath+"/"); | 
|             } | 
|         } | 
|         return true; | 
|     } | 
|     /*** | 
|      * @上传文件夹 | 
|      * @param pathName | 
|      *             文件夹 | 
|      * */ | 
|     public boolean delDirectory(String pathName ) throws Exception { | 
|         try { | 
|             this.ftpClient.changeWorkingDirectory( pathName.substring(0, pathName.lastIndexOf("/")) ); | 
|             ftpClient.removeDirectory(pathName); | 
|         }catch (IOException e) { | 
|             e.printStackTrace(); | 
|             log.info(pathName + "目录删除失败"); | 
|             return  false; | 
|         } | 
|   | 
|         return true; | 
|     } | 
| } |