实现 ftp 文件/文件夹的上传下载以及删除

基于apache commons-net的ftp 文件上传下载及删除 工具类,分享出来希望有人用得着,也方便自己以后查看~~~

package com.sslinm.tools;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

/**
 * 
 *【功能描述:ftp 工具类】
 *【功能详细描述:逐条详细描述功能】 
 * @author  【lfssay】
 * @see     【相关类/方法】
 * @version 【类版本号, 2013-8-19 下午4:39:37】
 * @since   【产品/模块版本】
 */

public class FtpUtils {

   
    public static void main(String[] args) {
//        boolean flag = fileUpload("E:/tt/data","/admin/");
       boolean flag =  fileDownload("E:/tt/te/128","/admin/748/","748");
//       System.out.println(flag);
//        boolean flag = deleteDir("/admin/3128/");
//        boolean flag = deleteFile("/admin/2616/input/a0012.xml");
        System.out.println(flag);
    }

    /**
     * 
     *【功能描述:得到ftp 登陆结果 FtpClient】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @return
     * @throws IOException
     */
    public static FTPClient getFTPClient() throws IOException{
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect(ConfigReader.get("ftp.server",""));
        boolean flag = ftpClient.login(ConfigReader.get("ftp.username",""),
                ConfigReader.get("ftp.pwd",""));
        if(flag){
            ftpClient.setControlKeepAliveTimeout(ConfigReader.getInt("ftp.active.time", 600));
            return ftpClient;
        }else{
            return null;
        }
    }
    
    /**
     * 
     *【功能描述:上传文件   和文件夹】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @param filePath  上传文件的路径
     * @param ftpRePath 上传后存储的相对位置  eg:/admin/pic/
     * @return true, 只有当所有流程都成功才返回true ,不为true就表示失败
     */
     
    @SuppressWarnings("finally")
    public static boolean fileUpload(String filePath,String ftpRePath) {
        FTPClient ftpClient = new FTPClient();
        try {

            ftpClient = getFTPClient();
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            
            // 使用迭代器的方法以后,只会建立一个ftpClient 连接,方便ftp性能稳固
            iterateUpload(ftpClient,filePath,ftpRePath);
            
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("FTP上传失败  ", e);
        } finally {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("关闭FTP出现异常  ", e);
            }
            //当所有流程都成功以后返回成功
            return true;
        }
    }
    
    /**
     * 
     *【功能描述:上传工具类,迭代】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @param ftpClient
     * @param filePath
     * @param ftpRePath
     * @throws IOException
     */
    public static void iterateUpload(FTPClient ftpClient,String filePath,String ftpRePath) throws IOException{
        File srcFile = new File(filePath);
        // 原始上传文件
        if(srcFile.isFile()){
            FileInputStream fis = new FileInputStream(srcFile);
            ftpClient.changeWorkingDirectory(ftpRePath);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.storeFile(srcFile.getName(), fis);
        }else if(srcFile.isDirectory()){
            // 只要是文件夹,就把当前文件夹的地址创建好。
            ftpClient.makeDirectory(ftpRePath+File.separator+srcFile.getName());
            File[] files = srcFile.listFiles();
            // 如果为空,就只创建文件夹
            for(File f:files){
                iterateUpload(ftpClient,f.getAbsolutePath(),ftpRePath+File.separator+srcFile.getName());
            }
        }
    }

    /**
     * 
     *【功能描述:ftp 下载, 指定下载ftp上某一个目录或者文件到本地】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @param downloadPath 本地地址
     * @param dir ftp上文件地址(相对的如:/admin/rt/)
     * @param fileName ftp上要下载的文件名
     * @return true, 只有所有流程都成功才返回true, 不为true就表示失败
     */
     
    @SuppressWarnings("finally")
    public static boolean fileDownload(String downloadPath,String dir,String fileName) {
        FTPClient ftpClient = new FTPClient();

        try {
            ftpClient = getFTPClient();
            ftpClient.setBufferSize(1024);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            
            iterateDown(ftpClient,dir,downloadPath+File.separator+fileName);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("FTP下载失败  ", e);
        } finally {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("关闭FTP连接失败  ", e);
            }
            return true;
        }
    } 
    
    
    /**
     * 
     *【功能描述:下载功能的迭代器,】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @param ftpClient ftpClient 连接器
     * @param dir ftp上的路径
     * @param downloadPath 本地路径
     * @throws IOException
     */
    public static void iterateDown(FTPClient ftpClient,String dir,String downloadPath) throws IOException{
        // 列出这个地址对应到的是文件夹还是文件
        FTPFile[] files = ftpClient.listFiles(dir);
        for(FTPFile f:files){
            //如果当前目录还没有创建,那么就在这里创建
            File filedown = new File(downloadPath);
            if(!filedown.exists()){
                filedown.mkdirs();
            }
            String localPath = downloadPath+File.separator+f.getName();
            File file = new File(localPath);
            if(f.isFile()){
                FileOutputStream fos = null;
                fos = new FileOutputStream(localPath);
                String path = dir+File.separator+f.getName();
                ftpClient.retrieveFile(path, fos);
                IOUtils.closeQuietly(fos);
            }else if(f.isDirectory()){
                file.mkdirs();
                iterateDown(ftpClient,dir+File.separator+f.getName(),localPath);
            }
        }
    }
    
    
    
    /**
     * 
     *【功能描述:删除ftp 上指定的文件】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @param ftpPath ftp上的文件路径
     * @return true 成功,false,失败
     */
    public static boolean deleteDir(String ftpPath){
        FTPClient ftpClient = new FTPClient();
        boolean flag = false;
        try {
            ftpClient = getFTPClient();
            ftpClient.setControlKeepAliveTimeout(ConfigReader.getInt("ftp.active.time", 600));
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            flag = iterateDelete(ftpClient,ftpPath);
            ftpClient.disconnect();
        } catch (IOException e) {
            // TODO 异常处理块
            e.printStackTrace();
        }
        return flag;
    }
    
    /**
     * 
     *【功能描述:删除文件夹】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @param ftpClient
     * @param ftpPath  文件夹的地址
     * @return true 表似成功,false 失败
     * @throws IOException
     */
    public static boolean iterateDelete(FTPClient ftpClient,String ftpPath) throws IOException{
        FTPFile[] files = ftpClient.listFiles(ftpPath);
        boolean flag = false;
        for(FTPFile f:files){
            String path = ftpPath+File.separator+f.getName();
            if(f.isFile()){
                // 是文件就删除文件
                ftpClient.deleteFile(path);
            }else if(f.isDirectory()){
               iterateDelete(ftpClient,path);
            }
        }
        // 每次删除文件夹以后就去查看该文件夹下面是否还有文件,没有就删除该空文件夹
        FTPFile[] files2 = ftpClient.listFiles(ftpPath); 
        if(files2.length==0){
            flag = ftpClient.removeDirectory(ftpPath);
        }else{
            flag = false;
        }
        return flag;
    }
    
    /**
     * 
     *【功能描述:删除文件】
     *【功能详细描述:功能详细描述】
     * @see   【类、类#方法、类#成员】
     * @param filePath
     * @return
     */
    public static boolean deleteFile(String filePath){
        boolean flag = false;
        try {
            FTPClient ftpClient = getFTPClient();
            flag = ftpClient.deleteFile(filePath);
        } catch (IOException e) {
            // TODO 异常处理块
            e.printStackTrace();
        }
        return flag;
        
    }

}

阅读更多

没有更多推荐了,返回首页