FTP文件的上传和下载---org.apache.commons.net.ftp.FTPClient

时间:2021-09-26 22:03:55

FTP文件的上传和下载---org.apache.commons.net.ftp.FTPClient

 327人阅读 评论(0) 收藏 举报 FTP文件的上传和下载---org.apache.commons.net.ftp.FTPClient 分类:

主要使用了包 commons-net-3.1.jar

下面把工具类代码贴出来:

[java] view plain copy
  1. package com.openeap.common.utils;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.net.SocketException;  
  10. import java.util.ArrayList;  
  11. import java.util.List;  
  12.   
  13. import org.apache.commons.io.FileUtils;  
  14. import org.apache.commons.io.IOUtils;  
  15. import org.apache.commons.net.ftp.FTPClient;  
  16. import org.apache.commons.net.ftp.FTPFile;  
  17. import org.apache.commons.net.ftp.FTPReply;  
  18. import org.apache.log4j.Logger;  
  19.   
  20. public class FTPUtil {  
  21.   
  22.     private static final Logger logger = Logger.getLogger(FTPUtil.class);  
  23.     private static String encoding = System.getProperty("file.encoding");  
  24.       
  25.     FTPClient client;  
  26.   
  27.     /** ftp服务器地址 */  
  28.     private String host;  
  29.     /** ftp 端口号 默认21 */  
  30.     private int port = 21;  
  31.     /** ftp服务器用户名 */  
  32.     private String username;  
  33.     /** ftp服务器密码 */  
  34.     private String password;  
  35.     /** ftp远程目录 */  
  36.     private String remoteDir;  
  37.     /** 本地存储目录 */  
  38.     private String localDir;  
  39.     /** 文件路径通配符 默认列出所有*/  
  40.     private String regEx = "*";  
  41.     /** 指定要下载的文件名 */  
  42.     private String downloadFileName;  
  43.   
  44.     /** 
  45.      * 设置连接属性 
  46.      *  
  47.      * @param host 
  48.      * @param username 
  49.      * @param password 
  50.      * @return 
  51.      */  
  52.     public FTPUtil setConfig(String host, String username, String password) {  
  53.         this.host = host;  
  54.         this.username = username;  
  55.         this.password = password;  
  56.         return this;  
  57.     }  
  58.   
  59.     /** 
  60.      * 设置连接属性 
  61.      *  
  62.      * @param host 
  63.      * @param port 
  64.      * @param username 
  65.      * @param password 
  66.      */  
  67.     public FTPUtil setConfig(String host, int port, String username,String password) {  
  68.         this.host = host;  
  69.         this.port = port;  
  70.         this.username = username;  
  71.         this.password = password;  
  72.         return this;  
  73.     }  
  74.   
  75.     /** 
  76.      * 连接FTP服务器 
  77.      */  
  78.     private FTPUtil connectServer() {  
  79.         client = new FTPClient();  
  80.         //设置超时时间  
  81.         client.setConnectTimeout(30000);  
  82.         try {  
  83.             // 1、连接服务器  
  84.             if(!client.isConnected()){  
  85.                 // 如果采用默认端口,可以使用client.connect(host)的方式直接连接FTP服务器  
  86.                 client.connect(host, port);  
  87.                 // 登录  
  88.                 client.login(username, password);  
  89.                 // 获取ftp登录应答码  
  90.                 int reply = client.getReplyCode();  
  91.                 // 验证是否登陆成功  
  92.                 if (!FTPReply.isPositiveCompletion(reply)) {  
  93.                     logger.info("未连接到FTP,用户名或密码错误。");  
  94.                     client.disconnect();  
  95.                     throw new RuntimeException("未连接到FTP,用户名或密码错误。");  
  96.                 } else {  
  97.                     logger.info("FTP连接成功。IP:"+host +"PORT:" +port);  
  98.                 }  
  99.                 // 2、设置连接属性  
  100.                 client.setControlEncoding(encoding);  
  101.                 // 设置以二进制方式传输  
  102.                 client.setFileType(FTPClient.BINARY_FILE_TYPE);    
  103.                 client.enterLocalPassiveMode();  
  104.             }  
  105.         } catch (SocketException e) {  
  106.             try {  
  107.                 client.disconnect();  
  108.             } catch (IOException e1) {  
  109.             }  
  110.             logger.error("连接FTP服务器失败" + e.getMessage());  
  111.             throw new RuntimeException("连接FTP服务器失败" + e.getMessage());  
  112.         } catch (IOException e) {  
  113.         }  
  114.         return this;  
  115.     }  
  116.       
  117.   
  118.     /** 
  119.      * 下载文件 
  120.      */  
  121.     public List<File> download(){  
  122.           
  123.         List<File> files = null;  
  124.           
  125.         this.connectServer();  
  126.         InputStream is = null;  
  127.         File downloadFile = null;  
  128.         try {  
  129.             // 1、设置远程FTP目录  
  130.             client.changeWorkingDirectory(remoteDir);  
  131.             logger.info("切换至工作目录【" + remoteDir + "】");  
  132.             // 2、读取远程文件  
  133.             FTPFile[] ftpFiles = client.listFiles(regEx);  
  134.             if(ftpFiles.length==0) {  
  135.                 logger.warn("文件数为0,没有可下载的文件!");  
  136.                 return null;  
  137.             }  
  138.             logger.info("准备下载" + ftpFiles.length + "个文件");  
  139.             // 3、保存文件到本地  
  140.             for (FTPFile file : ftpFiles) {  
  141.                 //如果有指定下载的文件  
  142.                 if(StringUtils.isNotBlank(downloadFileName) && !file.getName().equals(downloadFileName)){  
  143.                     continue;  
  144.                 }  
  145.                 if(files == null) files = new ArrayList<File>();  
  146.                 is = client.retrieveFileStream(file.getName());  
  147.                 if(is==nullthrow new RuntimeException("下载失败,检查文件是否存在");  
  148.                 downloadFile = new File(localDir + file.getName());  
  149.                 FileOutputStream fos = FileUtils.openOutputStream(downloadFile);  
  150.                 IOUtils.copy(is, fos);  
  151.                 client.completePendingCommand();  
  152.                 IOUtils.closeQuietly(is);  
  153.                 IOUtils.closeQuietly(fos);  
  154.                   
  155.                 /* 
  156.                 //另外一种方式,供参考 
  157.                 OutputStream is = new FileOutputStream(localFile); 
  158.                 ftpClient.retrieveFile(ff.getName(), is); 
  159.                 is.close(); 
  160.                 */  
  161.                   
  162.                 files.add(downloadFile);  
  163.             }  
  164.             logger.info("文件下载成功,下载文件路径:" + localDir);  
  165.             return files;  
  166.         } catch (IOException e) {  
  167.             logger.error("下载文件失败" + e.getMessage());  
  168.             throw new RuntimeException("下载文件失败" + e.getMessage());  
  169.         }  
  170.     }  
  171.       
  172.     /** 
  173.      * 下载文件 
  174.      * @param localDir 
  175.      * @param remoteDir 
  176.      */  
  177.     public List<File> download(String remoteDir,String localDir){  
  178.         this.remoteDir = remoteDir;  
  179.         this.localDir = localDir;  
  180.         return this.download();  
  181.     }  
  182.     /** 
  183.      * 下载文件 
  184.      * @param remoteDir 
  185.      * @param regEx 文件通配符 
  186.      * @param localDir 
  187.      * @return 
  188.      */  
  189.     public List<File> download(String remoteDir,String regEx,String localDir){  
  190.         this.remoteDir = remoteDir;  
  191.         this.localDir = localDir;  
  192.         this.regEx = regEx;  
  193.         return this.download();  
  194.     }  
  195.       
  196.     /** 
  197.      * 下载文件 
  198.      * @param downloadFileName 指定要下载的文件名称 
  199.      * @return 
  200.      */  
  201.     public List<File> download(String downloadFileName){  
  202.         this.downloadFileName = downloadFileName;  
  203.         return this.download();  
  204.     }  
  205.       
  206.     /** 
  207.      * 上传文件 
  208.      * @param files 
  209.      */  
  210.     public void upload(List<File> files){  
  211.           
  212.         OutputStream os = null;  
  213.         try {  
  214.             // 2、取本地文件  
  215.             if(files == null || files.size()==0) {  
  216.                 logger.warn("文件数为0,没有找到可上传的文件");  
  217.                 return;  
  218.             }  
  219.             logger.info("准备上传" + files.size() + "个文件");  
  220.             // 3、上传到FTP服务器  
  221.             for(File file : files){  
  222.                 this.connectServer();  
  223.                 // 1、设置远程FTP目录  
  224.                 client.changeWorkingDirectory(remoteDir);  
  225.                 logger.info("切换至工作目录【" + remoteDir + "】");  
  226.                 os = client.storeFileStream(file.getName());  
  227.                 if(os== nullthrow new RuntimeException("上传失败,请检查是否有上传权限");  
  228.                 IOUtils.copy(new FileInputStream(file), os);  
  229.                 IOUtils.closeQuietly(os);  
  230.             }  
  231.             logger.info("文件上传成功,上传文件路径:" + remoteDir);  
  232.         } catch (IOException e) {  
  233.             logger.error("上传文件失败" + e.getMessage());  
  234.             throw new RuntimeException("上传文件失败" + e.getMessage());  
  235.         }  
  236.     }  
  237.       
  238.     public OutputStream getOutputStream(String fileName){  
  239.         OutputStream os = null;  
  240.         this.connectServer();  
  241.         // 1、设置远程FTP目录  
  242.         try {  
  243.             client.changeWorkingDirectory(remoteDir);  
  244.             logger.info("切换至工作目录【" + remoteDir + "】");  
  245.             os = client.storeFileStream(fileName);  
  246.             if(os== nullthrow new RuntimeException("服务器上创建文件对象失败");  
  247.             return os;  
  248.         } catch (IOException e) {  
  249.             logger.error("服务器上创建文件对象失败" + e.getMessage());  
  250.             throw new RuntimeException("服务器上创建文件对象失败" + e.getMessage());  
  251.         }  
  252.     }  
  253.     /** 
  254.      * 上传文件 
  255.      * @param files 上传的文件 
  256.      * @param remoteDir 
  257.      */  
  258.     public void upload(List<File> files,String remoteDir){  
  259.         this.remoteDir = remoteDir;  
  260.         this.upload(files);  
  261.     }  
  262.       
  263.     /** 
  264.      * 上传文件 
  265.      * @param file 
  266.      */  
  267.     public void upload(File file){  
  268.         List<File> files = new ArrayList<File>();  
  269.         files.add(file);  
  270.         upload(files);  
  271.     }  
  272.       
  273.     /** 
  274.      * 判断文件在FTP上是否存在 
  275.      * @param fileName 
  276.      * @return 
  277.      */  
  278.     public boolean isFileExist(String fileName) {  
  279.           
  280.         boolean result = false;  
  281.         this.connectServer();  
  282.         try {  
  283.             // 1、设置远程FTP目录  
  284.             client.changeWorkingDirectory(remoteDir);  
  285.             logger.info("切换至工作目录【" + remoteDir + "】");  
  286.             // 2、读取远程文件  
  287.             FTPFile[] ftpFiles = client.listFiles(regEx);  
  288.             if(ftpFiles.length==0) {  
  289.                 logger.warn("文件数为0,没有可下载的文件!");  
  290.                 return result;  
  291.             }  
  292.             // 3、检查文件是否存在  
  293.             for (FTPFile file : ftpFiles) {  
  294.                 if(file.getName().equals(fileName)){  
  295.                     result = true;  
  296.                     break;  
  297.                 }  
  298.             }  
  299.         } catch (Exception e) {  
  300.             logger.error("检查文件是否存在失败" + e.getMessage());  
  301.             throw new RuntimeException("检查文件是否存在失败" + e.getMessage());  
  302.         }  
  303.           
  304.         return result;  
  305.     }  
  306.   
  307.      /** 
  308.      * 关闭连接 
  309.      */  
  310.     public void closeConnect() {  
  311.         try {  
  312.             client.disconnect();  
  313.             logger.info(" 关闭FTP连接!!! ");  
  314.         } catch (IOException e) {  
  315.             logger.warn(" 关闭FTP连接失败!!! ",e);  
  316.         }  
  317.     }  
  318.     public String getRemoteDir() {  
  319.         return remoteDir;  
  320.     }  
  321.   
  322.     public void setRemoteDir(String remoteDir) {  
  323.         this.remoteDir = remoteDir;  
  324.     }  
  325.   
  326.     public String getLocalPath() {  
  327.         return localDir;  
  328.     }  
  329.   
  330.     public void setLocalPath(String localPath) {  
  331.         this.localDir = localPath;  
  332.     }  
  333.   
  334.     public String getDownloadFileName() {  
  335.         return downloadFileName;  
  336.     }  
  337.   
  338.     public void setDownloadFileName(String downloadFileName) {  
  339.         this.downloadFileName = downloadFileName;  
  340.     }  
  341.       
  342.     @Override  
  343.     public String toString() {  
  344.         return "FTPUtil [host=" + host + ", port=" + port + ", username="  
  345.                 + username + ", password=" + password + "]";  
  346.     }  
  347. }