JAVA中使用FTPClient工具类上传下载

xiaoxiao2021-02-28  100

在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件。本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件。

1、写一个javabean文件,描述ftp上传或下载的信息

[java]  view plain  copy public class FtpUseBean {       private String host;       private Integer port;       private String userName;       private String password;       private String ftpSeperator;       private String ftpPath="";       private int repeatTime = 0;//连接ftp服务器的次数              public String getHost() {           return host;       }              public void setHost(String host) {           this.host = host;       }          public Integer getPort() {           return port;       }       public void setPort(Integer port) {           this.port = port;       }                     public String getUserName() {           return userName;       }              public void setUserName(String userName) {           this.userName = userName;       }              public String getPassword() {           return password;       }              public void setPassword(String password) {           this.password = password;       }          public void setFtpSeperator(String ftpSeperator) {           this.ftpSeperator = ftpSeperator;       }          public String getFtpSeperator() {           return ftpSeperator;       }          public void setFtpPath(String ftpPath) {           if(ftpPath!=null)               this.ftpPath = ftpPath;       }          public String getFtpPath() {           return ftpPath;       }          public void setRepeatTime(int repeatTime) {           if (repeatTime > 0)               this.repeatTime = repeatTime;       }          public int getRepeatTime() {           return repeatTime;       }          /**       * take an example:<br>       * ftp://userName:password@ip:port/ftpPath/       * @return        */       public String getFTPURL() {           StringBuffer buf = new StringBuffer();           buf.append("ftp://");           buf.append(getUserName());           buf.append(":");           buf.append(getPassword());           buf.append("@");           buf.append(getHost());           buf.append(":");           buf.append(getPort());           buf.append("/");           buf.append(getFtpPath());                       return buf.toString();       }   }   2、导入包commons-net-1.4.1.jar   [java]  view plain  copy package com.util;      import java.io.BufferedReader;   import java.io.ByteArrayOutputStream;   import java.io.DataOutputStream;   import java.io.File;   import java.io.FileOutputStream;   import java.io.IOException;   import java.io.InputStream;   import java.io.InputStreamReader;   import java.io.OutputStream;   import java.net.SocketException;   import java.net.URL;   import java.net.URLConnection;      import org.apache.commons.logging.Log;   import org.apache.commons.logging.LogFactory;   import org.apache.commons.net.ftp.FTP;   import org.apache.commons.net.ftp.FTPClient;   import org.apache.commons.net.ftp.FTPClientConfig;   import org.apache.commons.net.ftp.FTPFile;      import com.bean.FtpUseBean;      public class FtpUtil extends FTPClient {          private static Log log = LogFactory.getLog(FtpUtil.class);       private FtpUseBean ftpUseBean;       //获取目标路径下的文件属性信息,主要是获取文件的size       private FTPFile[] files;                  public FtpUseBean getFtpUseBean() {           return ftpUseBean;       }             public FtpUtil(){           super();       }                     public void setFtpUseBean(FtpUseBean ftpUseBean) {           this.ftpUseBean = ftpUseBean;       }              public boolean ftpLogin() {           boolean isLogined = false;           try {               log.debug("ftp login start ...");               int repeatTime = ftpUseBean.getRepeatTime();               for (int i = 0; i < repeatTime; i++) {                   super.connect(ftpUseBean.getHost(), ftpUseBean.getPort());                   isLogined = super.login(ftpUseBean.getUserName(), ftpUseBean.getPassword());                   if (isLogined)                       break;               }               if(isLogined)                   log.debug("ftp login successfully ...");               else                   log.debug("ftp login failed ...");               return isLogined;           } catch (SocketException e) {               log.error("", e);               return false;           } catch (IOException e) {               log.error("", e);               return false;           } catch (RuntimeException e) {               log.error("", e);               return false;           }       }          public void setFtpToUtf8() throws IOException {              FTPClientConfig conf = new FTPClientConfig();           super.configure(conf);           super.setFileType(FTP.IMAGE_FILE_TYPE);           int reply = super.sendCommand("OPTS UTF8 ON");           if (reply == 200) { // UTF8 Command               super.setControlEncoding("UTF-8");           }          }          public void close() {           if (super.isConnected()) {               try {                   super.logout();                   super.disconnect();                   log.debug("ftp logout ....");               } catch (Exception e) {                   log.error(e.getMessage());                   throw new RuntimeException(e.toString());               }           }       }          public void uploadFileToFtpByIS(InputStream inputStream, String fileName) throws IOException {           super.storeFile(ftpUseBean.getFtpPath()+fileName, inputStream);       }          public File downFtpFile(String fileName, String localFileName) throws IOException {           File outfile = new File(localFileName);           OutputStream oStream = null;           try {               oStream = new FileOutputStream(outfile);               super.retrieveFile(ftpUseBean.getFtpPath()+fileName, oStream);               return outfile;           } finally {               if (oStream != null)                   oStream.close();           }       }             public FTPFile[] listFtpFiles() throws IOException {           return super.listFiles(ftpUseBean.getFtpPath());       }          public void deleteFtpFiles(FTPFile[] ftpFiles) throws IOException {           String path = ftpUseBean.getFtpPath();           for (FTPFile ff : ftpFiles) {               if (ff.isFile()) {                   if (!super.deleteFile(path + ff.getName()))                       throw new RuntimeException("delete File" + ff.getName() + " is n't seccess");               }           }       }          public void deleteFtpFile(String fileName) throws IOException {           if (!super.deleteFile(ftpUseBean.getFtpPath() +fileName))               throw new RuntimeException("delete File" + ftpUseBean.getFtpPath() +fileName + " is n't seccess");       }          public InputStream downFtpFile(String fileName) throws IOException {           return super.retrieveFileStream(ftpUseBean.getFtpPath()+fileName);       }          /**       *        * @return       * @return StringBuffer       * @description 下载ftp服务器上的文件,addr为带用户名和密码的URL       */       public StringBuffer downloadBufferByURL(String addr) {           BufferedReader in = null;           try {               URL url = new URL(addr);               URLConnection conn = url.openConnection();               in = new BufferedReader(new InputStreamReader(conn.getInputStream()));               String line;               StringBuffer ret = new StringBuffer();               while ((line = in.readLine()) != null)                   ret.append(line);                              return ret;           } catch (Exception e) {               log.error(e);               return null;           } finally {               try {                   if (null != in)                       in.close();               } catch (IOException e) {                   e.printStackTrace();                   log.error(e);               }           }       }          /**       *        * @return       * @return byte[]       * @description 下载ftp服务器上的文件,addr为带用户名和密码的URL       */       public byte[] downloadByteByURL(String addr) {                      FTPClient ftp = null;                      try {                              URL url = new URL(addr);                              int port = url.getPort()!=-1?url.getPort():21;               log.info("HOST:"+url.getHost());               log.info("Port:"+port);               log.info("USERINFO:"+url.getUserInfo());               log.info("PATH:"+url.getPath());                              ftp = new FTPClient();                              ftp.setDataTimeout(30000);               ftp.setDefaultTimeout(30000);               ftp.setReaderThread(false);               ftp.connect(url.getHost(), port);               ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]);               FTPClientConfig conf = new FTPClientConfig("UNIX");                            ftp.configure(conf);                log.info(ftp.getReplyString());                              ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode()                ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);                   int reply = ftp.sendCommand("OPTS UTF8 ON");// try to                              log.debug("alter to utf-8 encoding - reply:" + reply);               if (reply == 200) { // UTF8 Command                   ftp.setControlEncoding("UTF-8");               }               ftp.setFileType(FTPClient.BINARY_FILE_TYPE);                  log.info(ftp.getReplyString());                              ByteArrayOutputStream out=new ByteArrayOutputStream();                         DataOutputStream o=new DataOutputStream(out);                         String remotePath = url.getPath();                         /**                        * Fixed:if doen't remove the first "/" at the head of url,                         * the file can't be retrieved.                        */                        if(remotePath.indexOf("/")==0) {                             remotePath = url.getPath().replaceFirst("/""");                        }                        ftp.retrieveFile(remotePath, o);                          byte[] ret = out.toByteArray();               o.close();                              String filepath = url.getPath();               ftp.changeWorkingDirectory(filepath.substring(0,filepath.lastIndexOf("/")));               files = ftp.listFiles();                              return ret;                  } catch (Exception ex) {               log.error("Failed to download file from ["+addr+"]!"+ex);                 } finally {               try {                   if (null!=ftp)                       ftp.disconnect();               } catch (Exception e) {                   //               }           }           return null;   //      StringBuffer buffer = downloadBufferByURL(addr);   //      return null == buffer ? null : buffer.toString().getBytes();       }                                   public FTPFile[] getFiles() {           return files;       }             public void setFiles(FTPFile[] files) {           this.files = files;       }         //  public static void getftpfilesize(String addr){   //         //      FTPClient ftp = null;   //         //      try {   //             //          URL url = new URL(addr);   //             //          int port = url.getPort()!=-1?url.getPort():21;   //          log.info("HOST:"+url.getHost());   //          log.info("Port:"+port);   //          log.info("USERINFO:"+url.getUserInfo());   //          log.info("PATH:"+url.getPath());   //             //          ftp = new FTPClient();   //             //          ftp.setDataTimeout(30000);   //          ftp.setDefaultTimeout(30000);   //          ftp.setReaderThread(false);   //          ftp.connect(url.getHost(), port);   //          ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]);   //          FTPClientConfig conf = new FTPClientConfig("UNIX");      //          ftp.configure(conf);    //          log.info(ftp.getReplyString());   //             //          ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode()    //          ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);    //   //          int reply = ftp.sendCommand("OPTS UTF8 ON");// try to   //             //          log.debug("alter to utf-8 encoding - reply:" + reply);   //          if (reply == 200) { // UTF8 Command   //              ftp.setControlEncoding("UTF-8");   //          }   //          ftp.setFileType(FTPClient.BINARY_FILE_TYPE);   //          ftp.changeWorkingDirectory(url.getPath());   //          FTPFile[] files = ftp.listFiles();   //          for (FTPFile flie : files){   //              System.out.println(new String(flie.getName().getBytes("gbk"),"ISO8859-1"));   //              System.out.println(flie.getSize());   //          }   //             //   //      } catch (Exception ex) {   //          log.error("Failed to download file from ["+addr+"]!"+ex);   //      } finally {   //          try {<pre class="java" name="code">         if (null!=ftp)   //          ftp.disconnect();    //          } catch (Exception e) {   }   }   }   }</pre>   <pre></pre>  
转载请注明原文地址: https://www.6miu.com/read-20371.html

最新回复(0)