ftpClient上传和下载

来源:互联网 发布:mysql root password 编辑:程序博客网 时间:2024/05/17 07:51
package easyway.tbs.transfer.ftp;  
  
import java.io.IOException;  
  
import org.apache.commons.net.ftp.FTPClient;  
/** 
 * FTPCLient回调 
 * @author longgangabai 
 * 
 * @param <T> 
 */  
public interface FTPClientCallback<T> {  
      
    public T doTransfer(FTPClient ftp)throws IOException;  
  
}  
 
 
Java代码  
package easyway.tbs.transfer.ftp;  
  
import java.io.IOException;  
import java.util.Collection;  
  
import org.apache.commons.net.ftp.FTPFile;  
  
/** 
 * FTP操作的客户端操作上传下载 
 * @author longgangbai 
 * 
 */  
public interface FTPClientOperations {  
    /** 
     * 文件上传的方法 
     * @param remote 
     * @param local 
     * @return 
     * @throws IOException 
     */  
    public UploadStatus upload(String remote, String local) throws IOException;  
      
  
     /** 
      *  
      * 从远程服务器目录下载文件到本地服务器目录中 
      * @param localdir FTP服务器保存目录 
      * @param remotedir FTP下载服务器目录 
      * @param localTempFile临时下载记录文件 
      * @return 成功返回true,否则返回false 
      */  
    public Collection<String> downloadList(final String localdir, final String remotedir,final String localTmpFile) throws IOException;  
  
    /** 
     * 文件下载的方法 
     * @param remote 
     * @param local 
     * @return 
     * @throws IOException 
     */  
    public DownloadStatus downloadFile( String local,String remote) throws IOException;  
      
    /** 
     * 查看服务器上文件列表方法 
     * @param remotedir 
     * @return 
     * @throws IOException 
     */  
    public FTPFile[] list(final String remotedir) throws IOException;  
}  
 
 
Java代码  
package easyway.tbs.transfer.ftp;  
  
import java.io.File;  
import java.io.IOException;  
import java.net.ConnectException;  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.Properties;  
  
import org.apache.commons.collections.CollectionUtils;  
import org.apache.commons.lang.ArrayUtils;  
import org.apache.commons.lang.StringUtils;  
import org.apache.commons.lang.math.NumberUtils;  
import org.apache.commons.net.ftp.FTPClient;  
import org.apache.commons.net.ftp.FTPClientConfig;  
import org.apache.commons.net.ftp.FTPFile;  
import org.apache.commons.net.ftp.FTPReply;  
import org.apache.log4j.Logger;  
  
import easyway.tbs.commons.FileOperateUtils;  
/** 
 * Ftp回调模板 
 *  
 * @author longgangbai 
 * 
 */  
public class FTPClientTemplate implements FTPClientOperations{  
    private static final Logger logger = Logger.getLogger(FTPClientTemplate.class);  
  
    private static String DEAFULT_REMOTE_CHARSET="UTF-8";  
    private static int DEAFULT_REMOTE_PORT=21;  
    private static String separator = File.separator;  
    private FTPClientConfig ftpClientConfig;  
    private String host;  
    private String username;  
    private String password;  
    private String port;  
      
    public FTPClientTemplate(String host,String user,String pwd,String port){  
        this.host=host;  
        this.username=user;  
        this.password=pwd;  
        this.port=port;  
    }  
    /** 
     * 查看服务器上文件列表方法 
     * @param remotedir 
     * @return 
     * @throws IOException 
     */  
    public FTPFile[] list(final String remotedir) throws IOException{  
       return   execute(new FTPClientCallback<FTPFile[]>(){  
        public FTPFile[] doTransfer(FTPClient ftp) throws IOException {  
             ftp.changeWorkingDirectory(remotedir);  
             FTPFile[] files= ftp.listFiles(remotedir);  
            return files;  
        }  
        });  
    }  
    /** 
     * 文件上传的方法 
     * @param remote 
     * @param local 
     * @return 
     * @throws IOException 
     */  
    public UploadStatus upload(final String local,final  String remote) throws IOException{  
        return   execute(new FTPClientCallback<UploadStatus>(){  
            public UploadStatus doTransfer(FTPClient ftpClient)throws IOException {  
                return FtpHelper.getInstance().upload(ftpClient, local, remote);  
            }  
        });  
    }  
      
    /** 
     * 上传文件到服务器,新上传和断点续传 
     * @param remoteFile  远程文件名,在上传之前已经将服务器工作目录做了改变 
     * @param localFile   本地文件File句柄,绝对路径 
     * @param processStep  需要显示的处理进度步进值 
     * @param ftpClient  FTPClient引用 
     * @return 
     * @throws IOException 
     */  
    public UploadStatus uploadFile(String remoteFile, File localFile,  
    FTPClient ftpClient, long remoteSize) throws IOException {  
         return FtpHelper.getInstance().uploadFile(remoteFile, localFile, ftpClient, remoteSize);  
    }  
  
      
     /** 
      * 从远程服务器目录下载文件到本地服务器目录中 
      * @param localdir FTP服务器保存目录 
      * @param remotedir FTP下载服务器目录 
      * @param localTempFile临时下载记录文件 
      * @return  成功下载记录 
      */  
    public Collection<String> downloadList(final String localdir, final String remotedir,final String localTmpFile) throws IOException {  
        return execute(new FTPClientCallback<Collection<String>>(){  
            public Collection<String> doTransfer(final FTPClient ftp) throws IOException {  
                //切换到下载目录的中  
                ftp.changeWorkingDirectory(remotedir);  
                //获取目录中所有的文件信息  
                FTPFile[] ftpfiles=ftp.listFiles();  
                Collection<String> fileNamesCol=new ArrayList<String>();  
                //判断文件目录是否为空  
                if(!ArrayUtils.isEmpty(ftpfiles)){  
                    for (FTPFile ftpfile : ftpfiles) {  
                        String remoteFilePath=remotedir+separator+ftpfile.getName();  
                        String localFilePath=localdir+separator+ftpfile.getName();  
                        System.out.println("remoteFilePath ="+remoteFilePath +" localFilePath="+localFilePath);  
                        //单个文件下载状态  
                        DownloadStatus downStatus=downloadFile(remoteFilePath, localFilePath);  
                        if(downStatus==DownloadStatus.Download_New_Success){  
                            //临时目录中添加记录信息  
                            fileNamesCol.add(remoteFilePath);  
                        }  
                    }  
                }  
                if(CollectionUtils.isNotEmpty(fileNamesCol)){  
                    FileOperateUtils.writeLinesToFile(fileNamesCol, localTmpFile);  
                }  
                return  fileNamesCol;  
            }  
        });  
    }  
      
    /** 
     * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 
     * @param remote  远程文件路径 
     * @param local 本地文件路径 
     * @return 上传的状态 
     * @throws IOException 
     *  
     */  
    public DownloadStatus downloadFile(final String remote, final String local) throws IOException{  
        return   execute(new FTPClientCallback<DownloadStatus>(){  
            public DownloadStatus doTransfer(FTPClient ftpClient) throws IOException {  
                DownloadStatus result=FtpHelper.getInstance().download(ftpClient, remote, local);  
                return result;  
            }  
        });  
    }  
    /** 
     * 执行FTP回调操作的方法 
     * @param callback   回调的函数 
     * @throws IOException 
     */  
    public <T> T  execute(FTPClientCallback<T> callback) throws IOException{  
        FTPClient ftp=new FTPClient();  
        try {  
                  
            /*if(getFtpClientConfig()!=null){ 
                 ftp.configure(getFtpClientConfig()); 
                 ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID()); 
            }*/  
            //登录FTP服务器  
            try {  
                //设置超时时间    
                ftp.setDataTimeout(7200);  
                //设置默认编码  
                 ftp.setControlEncoding(DEAFULT_REMOTE_CHARSET);  
                //设置默认端口  
                ftp.setDefaultPort(DEAFULT_REMOTE_PORT);  
                //设置是否显示隐藏文件  
                ftp.setListHiddenFiles(false);  
                //连接ftp服务器  
                if(StringUtils.isNotEmpty(port)&&NumberUtils.isDigits(port)){  
                        ftp.connect(host, Integer.valueOf(port));  
                }else{  
                    ftp.connect(host);  
                }  
            } catch(ConnectException e) {  
                logger.error("连接FTP服务器失败:"+ftp.getReplyString()+ftp.getReplyCode());  
                throw new IOException("Problem connecting the FTP-server fail",e);  
            }  
            //得到连接的返回编码  
            int reply=ftp.getReplyCode();  
              
            if(!FTPReply.isPositiveCompletion(reply)){  
                ftp.disconnect();  
            }  
            //登录失败权限验证失败  
            if(!ftp.login(getUsername(), getPassword())) {  
                ftp.quit();  
                ftp.disconnect();  
                logger.error("连接FTP服务器用户或者密码失败::"+ftp.getReplyString());  
                throw new IOException("Cant Authentificate to FTP-Server");  
            }  
            if(logger.isDebugEnabled()){  
                logger.info("成功登录FTP服务器:"+host+" 端口:"+port);  
            }  
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
            //回调FTP的操作  
            return callback.doTransfer(ftp);  
        }finally{  
            //FTP退出  
            ftp.logout();  
            //断开FTP连接  
            if(ftp.isConnected()){  
                ftp.disconnect();  
            }  
        }  
    }  
      
      protected String resolveFile(String file)  
      {  
          return null;  
        //return file.replace(System.getProperty("file.separator").charAt(0), this.remoteFileSep.charAt(0));  
      }  
      
    /** 
     * 获取FTP的配置操作系统 
     * @return 
     */  
    public FTPClientConfig getFtpClientConfig() {  
         //获得系统属性集    
        Properties props=System.getProperties();  
        //操作系统名称  
        String osname=props.getProperty("os.name");    
        //针对window系统  
        if(osname.equalsIgnoreCase("Windows XP")){  
            ftpClientConfig=new FTPClientConfig(FTPClientConfig.SYST_NT);  
        //针对linux系统  
        }else if(osname.equalsIgnoreCase("Linux")){  
            ftpClientConfig=new FTPClientConfig(FTPClientConfig.SYST_UNIX);  
        }  
        if(logger.isDebugEnabled()){  
            logger.info("the ftp client system os Name "+osname);  
        }  
        return ftpClientConfig;  
    }  
      
      
  
    public String getHost() {  
        return host;  
    }  
  
    public void setHost(String host) {  
        this.host = host;  
    }  
  
    public String getPassword() {  
        return password;  
    }  
  
    public void setPassword(String password) {  
        this.password = password;  
    }  
  
    public String getUsername() {  
        return username;  
    }  
  
    public void setUsername(String username) {  
        this.username = username;  
    }  
  
      
      
  
}  
 
 
Java代码  
package easyway.tbs.transfer.ftp;  
  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.io.RandomAccessFile;  
import java.util.StringTokenizer;  
  
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;  
/** 
 * FTP下载工具类 
 * @author longgangbai 
 * 
 */  
public class FtpHelper {  
    private static String DEAFULT_REMOTE_CHARSET="GBK";  
    private static String DEAFULT_LOCAL_CHARSET="iso-8859-1";  
  
  
      
    private static FtpHelper instance=new FtpHelper();  
      
    public static FtpHelper getInstance(){  
         return instance;  
    }  
    /** 
     * 连接到FTP服务器 
     * @param hostname主机名 
     * @param port 端口 
     * @param username 用户名 
     * @param password 密码 
     * @return 是否连接成功 
     * @throws IOException 
     */  
    public  boolean connect(FTPClient ftpClient,String hostname, int port, String username,String password) throws IOException {  
        ftpClient.connect(hostname, port);  
        ftpClient.setControlEncoding(DEAFULT_REMOTE_CHARSET);  
        if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  
            if (ftpClient.login(username, password)) {  
                return true;  
            }  
        }  
        disconnect(ftpClient);  
        return false;  
    }  
  
    /** 
     * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 
     * @param remoteFilePath  远程文件路径 
     * @param localFilePath 本地文件路径 
     * @return 上传的状态 
     * @throws IOException 
     */  
    public DownloadStatus download(FTPClient ftpClient,String remoteFilePath, String localFilePath)  
    throws IOException {  
        // 设置被动模式  
        ftpClient.enterLocalPassiveMode();  
        // 设置以二进制方式传输  
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);  
        DownloadStatus result;  
        // 检查远程文件是否存在  
        FTPFile[] files = ftpClient.listFiles(new String(  
        remoteFilePath.getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET));  
        if (files.length != 1) {  
            System.out.println("远程文件不存在");  
            return DownloadStatus.Remote_File_Noexist;  
        }  
        long lRemoteSize = files[0].getSize();  
        File f = new File(localFilePath);  
        // 本地存在文件,进行断点下载  
        if (f.exists()) {  
            long localSize = f.length();  
            // 判断本地文件大小是否大于远程文件大小  
            if (localSize >= lRemoteSize) {  
                System.out.println("本地文件大于远程文件,下载中止");  
                return DownloadStatus.Local_Bigger_Remote;  
            }  
            // 进行断点续传,并记录状态  
            FileOutputStream out = new FileOutputStream(f, true);  
            ftpClient.setRestartOffset(localSize);  
            InputStream in = ftpClient.retrieveFileStream(new String(remoteFilePath  
            .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET));  
            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 = DownloadStatus.Download_From_Break_Success;  
            } else {  
                result = DownloadStatus.Download_From_Break_Failed;  
            }  
        } else {  
            OutputStream out = new FileOutputStream(f);  
            InputStream in = ftpClient.retrieveFileStream(new String(remoteFilePath  
            .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET));  
            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 = DownloadStatus.Download_New_Success;  
            } else {  
                result = DownloadStatus.Download_New_Failed;  
            }  
        }  
        return result;  
    }  
    /** 
     *  
     * 上传文件到FTP服务器,支持断点续传 
     * @param localFilePath  本地文件名称,绝对路径 
     * @param remoteFilePath   远程文件路径,使用/home/directory1/subdirectory/file.ext 
     * 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 
     * @return 上传结果 
     * @throws IOException 
     */  
    public UploadStatus upload(FTPClient ftpClient,String localFilePath, String remoteFilePath) throws IOException {  
        // 设置PassiveMode传输  
        ftpClient.enterLocalPassiveMode();  
        // 设置以二进制流的方式传输  
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);  
        ftpClient.setControlEncoding(DEAFULT_REMOTE_CHARSET);  
        UploadStatus result;  
        // 对远程目录的处理  
        String remoteFileName = remoteFilePath;  
        if (remoteFilePath.contains("/")) {  
            remoteFileName = remoteFilePath.substring(remoteFilePath.lastIndexOf("/") + 1);  
            // 创建服务器远程目录结构,创建失败直接返回  
            if (createDirecroty(remoteFilePath, ftpClient) == UploadStatus.Create_Directory_Fail) {  
                return UploadStatus.Create_Directory_Fail;  
            }  
        }  
        // ftpClient.feat();  
        // System.out.println( ftpClient.getReply());  
        // System.out.println( ftpClient.acct(null));  
        // System.out.println(ftpClient.getReplyCode());  
        // System.out.println(ftpClient.getReplyString());  
        // 检查远程是否存在文件  
        FTPFile[] files = ftpClient.listFiles(new String(remoteFileName  
        .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET));  
        if (files.length == 1) {  
            long remoteSize = files[0].getSize();  
            File f = new File(localFilePath);  
            long localSize = f.length();  
            if (remoteSize == localSize) { // 文件存在  
                return UploadStatus.File_Exits;  
            } else if (remoteSize > localSize) {  
                return UploadStatus.Remote_Bigger_Local;  
            }  
            // 尝试移动文件内读取指针,实现断点续传  
            result = uploadFile(remoteFileName, f, ftpClient, remoteSize);  
            // 如果断点续传没有成功,则删除服务器上文件,重新上传  
            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, new File(localFilePath), ftpClient, 0);  
        }  
        return result;  
    }  
    /** 
     *  
     * 断开与远程服务器的连接 
     * @throws IOException 
     */  
    public void disconnect(FTPClient ftpClient) throws IOException {  
        if (ftpClient.isConnected()) {  
            ftpClient.disconnect();  
        }  
    }  
    /** 
     * 递归创建远程服务器目录 
     * @param remote 远程服务器文件绝对路径 
     * @param ftpClient  FTPClient对象 
     * @return 目录创建是否成功 
     * @throws IOException 
     */  
    public UploadStatus createDirecroty(String remote, FTPClient ftpClient)  
    throws IOException {  
        UploadStatus status = UploadStatus.Create_Directory_Success;  
        String directory = remote.substring(0, remote.lastIndexOf("/") + 1);  
        if (!directory.equalsIgnoreCase("/")  
        && !ftpClient.changeWorkingDirectory(new String(directory  
        .getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET))) {  
            // 如果远程目录不存在,则递归创建远程服务器目录  
            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(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET);  
                if (!ftpClient.changeWorkingDirectory(subDirectory)) {  
                    if (ftpClient.makeDirectory(subDirectory)) {  
                        ftpClient.changeWorkingDirectory(subDirectory);  
                    } else {  
                        System.out.println("创建目录失败");  
                        return UploadStatus.Create_Directory_Fail;  
                    }  
                }  
                start = end + 1;  
                end = directory.indexOf("/", start);  
                // 检查所有目录是否创建完毕  
                if (end <= start) {  
                    break;  
                }  
            }  
        }  
        return status;  
    }  
  
    /** 
     * 上传文件到服务器,新上传和断点续传 
     * @param remoteFile  远程文件名,在上传之前已经将服务器工作目录做了改变 
     * @param localFile   本地文件File句柄,绝对路径 
     * @param processStep  需要显示的处理进度步进值 
     * @param ftpClient  FTPClient引用 
     * @return 
     * @throws IOException 
     */  
    public UploadStatus uploadFile(String remoteFile, File localFile,  
    FTPClient ftpClient, long remoteSize) throws IOException {  
        UploadStatus status;  
        // 显示进度的上传  
        long step = localFile.length() / 100;  
        long process = 0;  
        long localreadbytes = 0L;  
        RandomAccessFile raf = new RandomAccessFile(localFile, "r");  
        String remote = new String(remoteFile.getBytes(DEAFULT_REMOTE_CHARSET), DEAFULT_LOCAL_CHARSET);  
        OutputStream out = ftpClient.appendFileStream(remote);  
        if (out == null)  
        {  
            String message = ftpClient.getReplyString();  
            throw new RuntimeException(message);  
        }  
        // 断点续传  
        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 ? UploadStatus.Upload_From_Break_Success  
            : UploadStatus.Upload_From_Break_Failed;  
        } else {  
            status = result ? UploadStatus.Upload_New_File_Success  
            : UploadStatus.Upload_New_File_Failed;  
        }  
        return status;  
    }  
      
      
     protected void makeRemoteDir(FTPClient ftp, String dir)  
        throws IOException  
      {  
        String workingDirectory = ftp.printWorkingDirectory();  
        if (dir.indexOf("/") == 0) {  
          ftp.changeWorkingDirectory("/");  
        }  
        String subdir = new String();  
        StringTokenizer st = new StringTokenizer(dir, "/");  
        while (st.hasMoreTokens()) {  
          subdir = st.nextToken();  
          if (!(ftp.changeWorkingDirectory(subdir))) {  
            if (!(ftp.makeDirectory(subdir)))  
            {  
              int rc = ftp.getReplyCode();  
              if (((rc != 550) && (rc != 553) && (rc != 521)))  
              {  
                throw new IOException("could not create directory: " + ftp.getReplyString());  
              }  
            }  
            else {  
              ftp.changeWorkingDirectory(subdir);  
            }  
          }  
        }  
        if (workingDirectory != null){  
          ftp.changeWorkingDirectory(workingDirectory);  
        }  
      }  
  
      
      
      
      
      
      
      
      
    /** 
     * 获取指定目录下的文件名称列表 
     * @param currentDir 
     *            需要获取其子目录的当前目录名称 
     * @return 返回子目录字符串数组 
     */  
    public String[] GetFileNames(FTPClient ftpClient,String currentDir) {  
        String[] dirs = null;  
        try {  
            if (currentDir == null)  
                dirs = ftpClient.listNames();  
            else  
                dirs = ftpClient.listNames(currentDir);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return dirs;  
    }  
  
    /** 
     * 获取指定目录下的文件与目录信息集合 
     * @param currentDir 
     *            指定的当前目录 
     * @return 返回的文件集合 
     */  
    public FTPFile[] GetDirAndFilesInfo(FTPClient ftpClient,String currentDir)  
    {  
        FTPFile[] files = null;  
        try  
        {  
            if (currentDir == null)  
                files = ftpClient.listFiles();  
            else  
                files = ftpClient.listFiles(currentDir);  
        }  
        catch (IOException ex)  
        {  
            ex.printStackTrace();  
        }  
        return files;  
    }  
}  
 
 
 
Java代码  
package easyway.tbs.transfer.ftp;  
  
import easyway.tbs.commons.EnumUtils;  
  
/** 
 * 文件下载状态 
 * @author longgangbai 
 * 
 */  
public enum DownloadStatus {  
         
        Remote_File_Noexist(0,"远程文件不存在"), // 远程文件不存在   
        //用于单个下载  
        Download_New_Success(1,"下载文件成功"), // 下载文件成功  
        Download_New_Failed(2,"下载文件失败"), // 下载文件失败  
        Local_Bigger_Remote(3,"本地文件大于远程文件"), // 本地文件大于远程文件  
        Download_From_Break_Success(4,"文件断点续传成功"), // 断点续传成功  
        Download_From_Break_Failed(5,"文件断点续传失败"), // 断点续传失败  
        //用于批量下载  
        Download_Batch_Success(6,"文件批量下载成功"),  
        Download_Batch_Failure(7,"文件批量下载失败"),  
        Download_Batch_Failure_SUCCESS(8,"文件批量下载不完全成功");  
      
        private int code;  
          
        private String description;  
          
          
        private DownloadStatus(int code , String description) {  
            this.code = code;  
            this.description = description;  
        }  
  
        public int getCode() {  
            return code;  
        }  
  
        public void setCode(int code) {  
            this.code = code;  
        }  
  
        public String getDescription() {  
            return description;  
        }  
  
        public void setDescription(String description) {  
            this.description = description;  
        }  
          
        /** 
         * 下载状态中中使用的code 
         * @param code 
         * @return 
         */  
        public static DownloadStatus fromCode(int code) {  
            return EnumUtils.fromEnumProperty(DownloadStatus.class, "code", code);  
        }  
    }  
 
 
 
Java代码  
package easyway.tbs.transfer.ftp;  
  
import easyway.tbs.commons.EnumUtils;  
  
/** 
 * 文件上传状态 
 * @author longgangbai 
 * 
 */  
public enum UploadStatus {  
    Create_Directory_Fail(0,"远程服务器相应目录创建失败"), // 远程服务器相应目录创建失败  
    Create_Directory_Success(1,"远程服务器闯将目录成功"), // 远程服务器闯将目录成功  
    Upload_New_File_Success(2,"上传新文件成功"), // 上传新文件成功  
    Upload_New_File_Failed(3,"上传新文件失败"), // 上传新文件失败  
    File_Exits(4,"文件已经存在"), // 文件已经存在  
    Remote_Bigger_Local(5,"远程文件大于本地文件"), // 远程文件大于本地文件  
    Upload_From_Break_Success(6," 断点续传成功"), // 断点续传成功  
    Upload_From_Break_Failed(7,"断点续传失败"), // 断点续传失败  
    Delete_Remote_Faild(8,"删除远程文件失败"); // 删除远程文件失败  
      
    private int code;  
      
    private String description;  
      
      
    private UploadStatus(int code , String description) {  
        this.code = code;  
        this.description = description;  
    }  
  
    public int getCode() {  
        return code;  
    }  
  
    public void setCode(int code) {  
        this.code = code;  
    }  
  
    public String getDescription() {  
        return description;  
    }  
  
    public void setDescription(String description) {  
        this.description = description;  
    }  
      
    /** 
     * 下载状态中中使用的code 
     * @param code 
     * @return 
     */  
    public static UploadStatus fromCode(int code) {  
        return EnumUtils.fromEnumProperty(UploadStatus.class, "code", code);  
    }  
}  
 
Java代码  
package easyway.tbs.commons;  
  
import org.apache.commons.lang.ObjectUtils;  
import org.apache.log4j.Logger;  
  
/** 
 * 枚举的工具类 
 * @author longgangbai 
 * 
 */  
public abstract class EnumUtils {  
    private static final Logger logger = Logger.getLogger(EnumUtils.class);  
  
        /** 
     * 从指定的枚举类中根据property搜寻匹配指定值的枚举实例 
     * @param <T> 
     * @param enumClass 
     * @param property 
     * @param propValue 
     * @return 
     */  
    public static <T extends Enum<T>> T fromEnumProperty(Class<T> enumClass, String property, Object propValue) {  
        T[] enumConstants = enumClass.getEnumConstants();  
        for (T t : enumConstants) {  
            Object constantPropValue;  
            try {  
                constantPropValue = BeanUtils.getDeclaredFieldValue(t, property);  
                if (ObjectUtils.equals(constantPropValue, propValue)) {  
                    return t;  
                }  
            } catch (Exception e) {  
                logger.error(e.getMessage());  
                throw new RuntimeException(e);  
            }  
        }  
        return null;  
    }  
  
    /** 
     * 从指定的枚举类中根据名称匹配指定值 
     * @param <T> 
     * @param enumClass 
     * @param constantName 
     * @return 
     */  
    public static <T extends Enum<T>> T fromEnumConstantName(Class<T> enumClass, String constantName) {  
        T[] enumConstants = enumClass.getEnumConstants();  
        for (T t : enumConstants) {  
            if (((Enum<?>) t).name().equals(constantName)) {  
                return t;  
            }  
        }  
        return null;  
    }  
      
}  
 
 
Java代码  
package easyway.tbs.commons;  
  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStream;  
import java.util.Collection;  
  
import org.apache.commons.io.FileUtils;  
import org.apache.commons.io.IOCase;  
import org.apache.commons.io.IOUtils;  
import org.apache.commons.io.filefilter.FalseFileFilter;  
import org.apache.commons.io.filefilter.FileFilterUtils;  
import org.apache.commons.io.filefilter.IOFileFilter;  
import org.apache.log4j.Logger;  
/** 
 * 文件操作工具类 
 *  
 * @author longgangbai 
 *  
 */  
public class FileOperateUtils {  
      
    private static final Logger logger = Logger.getLogger(FileOperateUtils.class);    
    /** 
     * 查找需要合并文件的临时文件信息  
     *  
     * @param directory 
     *          临时文件所在的目录 
     * @param prefix 
     *          临时文件的前缀 
     * @param caseSensitivity 
     *          临时文件的大小写敏感 
     * @return 
     */  
    public static Collection<File> searchPrefixFile(File directory,String prefix,boolean caseSensitivity){  
        IOCase iocase=IOCase.INSENSITIVE;  
        if(caseSensitivity){  
             iocase=IOCase.SENSITIVE;  
        }  
        //创建相关的过滤器  
        IOFileFilter fileFilter=FileFilterUtils.prefixFileFilter(prefix, iocase);  
        //检查相关的过滤信息  
        return FileUtils.listFiles(directory, fileFilter, FalseFileFilter.INSTANCE);  
    }  
      
    /** 
     *  查找目录下特定后缀的文件 
     * @param directory     
     *       特定的目录 
     * @param extensions 
     *      临时文件的后缀扩展 
     * @param recursive 
     *      是否查询临时文件所在的目录下的子目录 
     * @return 
     */  
    public static Collection<File> searchExtensionFile(File directory,String[] extensions,boolean recursive){  
        return FileUtils.listFiles(directory, extensions, recursive);  
    }  
    /** 
     * 文件追加功能 
     * @param lines 
     * @param tmpFilePath 
     */  
    public static void writeLinesToFile(Collection<String> lines,String tmpFilePath){  
        OutputStream output=null;  
        try {  
            output = new FileOutputStream(tmpFilePath,true);  
            IOUtils.writeLines(lines, "UTF-8", output);  
        } catch (Exception e) {  
            logger.error(tmpFilePath+"追加文件失败"+e.getMessage());  
        }  
          
    }  
}  
0 0