ftp工具类

===============================================================

package com.suning.search.admin.web.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.io.FileUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ftp下载文件类
 * 
 * 
 */
public class FtpUtils {
    private final static Logger logger = LoggerFactory.getLogger(FtpUtils.class);

    private String ftpUrl;
    private String ftpAccount;
    private String ftpPassword;

    public final static String BI_TEMP_FILE = "/opt/search/admin/bi/";

    static {
        File biDir = new File(BI_TEMP_FILE);
        if (!biDir.exists()) {
            biDir.mkdirs();
        }
    }

    public FtpUtils() {
        super();
    }

    public FtpUtils(String ftpUrl, String ftpAccount, String ftpPassword) {
        super();
        this.ftpUrl = ftpUrl;
        this.ftpAccount = ftpAccount;
        this.ftpPassword = ftpPassword;
    }

    public String downloadFile(String path, String fileName, String localPath) {
        FTPClient fc = new FTPClient();
        String ret = null;
        try {
            fc.connect(ftpUrl);
            fc.user(ftpAccount);
            fc.pass(ftpPassword);
            logger.info("链接服务器:" + fc.isConnected());
            logger.info("切换目录:" + fc.changeWorkingDirectory(path));
            FTPFile[] files = fc.listFiles();
            File dir = new File(localPath);
            if (!dir.exists()) {
                dir.mkdir();
            }
            for (FTPFile file : files) {
                if (file.getName().startsWith((fileName))) {
                    logger.info("开始下载:" + file.getName());
                    long begin = System.currentTimeMillis();
                    File localFile = new File(localPath + file.getName());
                    if (!localFile.exists()) {
                        localFile.createNewFile();
                    }
                    OutputStream is = new FileOutputStream(localFile);
                    fc.retrieveFile(file.getName(), is);
                    is.close();
                    ret = file.getName();
                    logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
                }
            }
        } catch (SocketException e) {
            logger.error("下载BI文件时出现错误", e);
        } catch (IOException e) {
            logger.error("下载BI文件时出现错误", e);
        }
        return ret;
    }

    public boolean uploadFile(String path, String fileName, String localFile) {
        FTPClient fc = new FTPClient();
        boolean result = true;// 文件上传是否成功
        try {
            fc.connect(ftpUrl);
            fc.user(ftpAccount);
            fc.pass(ftpPassword);
            logger.info("链接服务器:" + fc.isConnected());
            logger.info("切换目录:" + path + " : " + changeDirectory(path, fc));
            FTPFile[] files = fc.listFiles();
            for (FTPFile ftpFile : files) {
                if (ftpFile.isFile() && ftpFile.getName().equals(fileName)) {
                    fc.deleteFile(ftpFile.getName());
                }
            }

            InputStream input = new FileInputStream(localFile);
            result = fc.storeFile(fileName, input);
            input.close();
        } catch (SocketException e) {
            logger.error("下载BI文件时出现错误", e);
        } catch (IOException e) {
            logger.error("下载BI文件时出现错误", e);
        }

        return result;
    }

    public void removeFiles(String path) {
        FTPClient fc = new FTPClient();
        try {
            fc.connect(ftpUrl);
            fc.user(ftpAccount);
            fc.pass(ftpPassword);
            logger.info("链接服务器:" + fc.isConnected());
            logger.info("切换目录:" + fc.changeWorkingDirectory(path));
            FTPFile[] files = fc.listFiles();
            for (FTPFile file : files) {
                if (file.isFile()) {
                    fc.deleteFile(file.getName());
                }
            }
        } catch (SocketException e) {
            logger.error("删除文件时出现错误", e);
        } catch (IOException e) {
            logger.error("删除文件时出现错误", e);
        }
    }

    /**
     * 通过前缀下载文件
     * 
     * @param preStr 前缀
     * @return 文件名
     */
    public String downloadFiles(String preStr, String localPath) {
        FTPClient fc = new FTPClient();
        try {
            fc.connect(ftpUrl);
            fc.user(ftpAccount);
            fc.pass(ftpPassword);
            logger.info("链接服务器:" + fc.isConnected());
            logger.info("切换目录:" + fc.changeWorkingDirectory("/etldata/output/net_search"));
            FTPFile[] files = fc.listFiles();
            logger.info("开始处理前缀为" + preStr + "的CSV文件");
            String fileName = getFileName(preStr);
            File dir = new File(localPath);
            if (!dir.exists()) {
                dir.mkdir();
            }
            for (FTPFile file : files) {
                if (file.getName().equals(fileName)) {
                    logger.info("开始下载:" + file.getName());
                    long begin = System.currentTimeMillis();
                    File localFile = new File(localPath + fileName);
                    if (!localFile.exists()) {
                        localFile.createNewFile();
                    }
                    OutputStream is = new FileOutputStream(localFile);
                    fc.retrieveFile(file.getName(), is);
                    is.close();
                    logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
                }
            }
            return fileName;
        } catch (SocketException e) {
            logger.error("下载BI文件时出现错误", e);
        } catch (IOException e) {
            logger.error("下载BI文件时出现错误", e);
        }
        return null;
    }

    /**
     * 通过前缀下载文件
     * 
     * @param preStr 前缀
     * @return 文件名
     */
    public String downloadFiles(String preStr) {
        FTPClient fc = new FTPClient();
        try {
            fc.connect(ftpUrl);
            fc.user(ftpAccount);
            fc.pass(ftpPassword);
            logger.info("链接服务器:" + fc.isConnected());
            logger.info("切换目录:" + fc.changeWorkingDirectory("/etldata/output/net_search"));
            FTPFile[] files = fc.listFiles();
            logger.info("开始处理前缀为" + preStr + "的CSV文件");
            String fileName = getFileName(preStr);
            File dir = new File(BI_TEMP_FILE);
            if (!dir.exists()) {
                dir.mkdir();
            }
            for (FTPFile file : files) {
                if (file.getName().equals(fileName)) {
                    logger.info("开始下载:" + file.getName());
                    long begin = System.currentTimeMillis();
                    File localFile = new File(BI_TEMP_FILE + fileName);
                    if (!localFile.exists()) {
                        localFile.createNewFile();
                    }
                    OutputStream is = new FileOutputStream(localFile);
                    fc.retrieveFile(file.getName(), is);
                    is.close();
                    logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
                }
            }
            return fileName;
        } catch (SocketException e) {
            logger.error("下载BI文件时出现错误", e);
        } catch (IOException e) {
            logger.error("下载BI文件时出现错误", e);
        }
        return null;
    }

    public String[] downloadMonthFiles(String preStr) {
        FTPClient fc = new FTPClient();
        try {
            fc.connect(ftpUrl);
            fc.user(ftpAccount);
            fc.pass(ftpPassword);
            logger.info("链接服务器:" + fc.isConnected());
            logger.info("切换目录:" + fc.changeWorkingDirectory("/etldata/output/net_search"));
            FTPFile[] files = fc.listFiles();
            logger.info("开始处理前缀为" + preStr + "的CSV文件");
            String[] fileNames = getMonthFileNames(preStr);
            for (String fileName : fileNames) {
                for (FTPFile file : files) {
                    if (file.getName().equals(fileName)) {
                        logger.info("开始下载:" + file.getName());
                        long begin = System.currentTimeMillis();
                        File localFile = new File(BI_TEMP_FILE + fileName);
                        if (!localFile.exists()) {
                            localFile.createNewFile();
                        }
                        OutputStream is = new FileOutputStream(localFile);
                        fc.retrieveFile(file.getName(), is);
                        is.close();
                        logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
                    }
                }
            }
            return fileNames;
        } catch (SocketException e) {
            logger.error("下载BI文件时出现错误", e);
        } catch (IOException e) {
            logger.error("下载BI文件时出现错误", e);
        }
        return null;
    }

    // ftp切换目录,不存在就创建
    public boolean changeDirectory(String path, FTPClient ftp) {
        FTPFile[] files;
        boolean result = false;
        String[] str = path.split("/");
        for (String s : str) {
            try {
                boolean exist = false;// 路径是否存在
                files = ftp.listFiles();
                for (FTPFile f : files) {
                    if (f.isDirectory() && !"".equals(s) && f.getName().equals(s)) {
                        exist = true;
                    }
                }
                if (!exist) {
                    ftp.makeDirectory(s);
                }
                result = ftp.changeWorkingDirectory(s);
            } catch (IOException e) {
                logger.error("连接FTP异常", e);
            }
        }
        return result;
    }

    @SuppressWarnings("deprecation")
    public String getFileName(String preStr) {
        Date date = new Date();
        date.setDate(date.getDate() - 1);
        String fileName = null;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        fileName = preStr + sdf.format(date) + ".CSV";
        return fileName;
    }

    public String[] getMonthFileNames(String preStr) {
        Calendar calendar = new GregorianCalendar();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        Calendar currentDay = new GregorianCalendar(year, month, day);

        String[] fileNames = new String[30];
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        for (int i = 0; i < fileNames.length; i++) {
            fileNames[i] = preStr + sdf.format(currentDay.getTime()) + ".CSV";
            logger.info(fileNames[i]);
            currentDay.add(Calendar.DATE, -1);
        }
        return fileNames;
    }

    public void deleteFiles() {
        File dir = new File(BI_TEMP_FILE);
        File[] files = dir.listFiles();
        for (File file : files) {
            FileUtils.deleteQuietly(file);
        }
    }

    public String getFtpUrl() {
        return ftpUrl;
    }

    public void setFtpUrl(String ftpUrl) {
        this.ftpUrl = ftpUrl;
    }

    public String getFtpAccount() {
        return ftpAccount;
    }

    public void setFtpAccount(String ftpAccount) {
        this.ftpAccount = ftpAccount;
    }

    public String getFtpPassword() {
        return ftpPassword;
    }

    public void setFtpPassword(String ftpPassword) {
        this.ftpPassword = ftpPassword;
    }
}
=====================================================

http://www.cxyclub.cn/n/10536/

1、远程FTP服务连接 
2、FTP上传文件 
3、FTP下载文件,注意:在下载多个文件时,必须执行:ftpClient.completePendingCommand();否则,is = ftpClient.retrieveFileStream(file.getName());返回NUll 
4、FTP文件的删除 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.ArrayList; 
import java.util.List; 

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; 

/** 
*  ftp上传下载类 
* @author 
* 
*/ 
public class BankReceiptFTPUtil { 
private Logger logger = Logger.getLogger(BankReceiptFTPUtil.class); 
private String ip ; 
private int port; 
private String pwd; 
private String user; 
private FTPClient ftpClient; 

public BankReceiptFTPUtil(String ip, int port, String user, String pwd) { 
this.ip = ip; 
this.port = port; 
this.user = user; 
this.pwd = pwd; 
} 

/** 
* 连接FTP服务器 
* @param ip ip地址 
* @param port 端口号 
* @param user 用户名 
* @param pwd 密码 
* @return 
* @throws Exception 
*/ 
public boolean connectServer(String ip, int port, String user, String pwd) throws Exception { 
boolean isSuccess = false; 
try { 
ftpClient = new FTPClient(); 
ftpClient.connect(ip, port); 
ftpClient.setControlEncoding("GBK"); 
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT); 
conf.setServerLanguageCode("zh"); 
ftpClient.login(user, pwd); 
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { 
isSuccess = true; 
} else { 
ftpClient.disconnect(); 
logger.error("连接ftp服务器异常!"); 
throw new BossOperException(); 
} 
} catch (Exception e) { 
logger.error("连接FTP服务器异常.." ,e); 
} 

return isSuccess ; 
} 

/** 
* 远程FTP下载文件 
* @param remotePath 
* @param localPath 
* @param fileName 
* @return 
* @throws Exception 
*/ 
public List<File> downloadFile(String remotePath, String localPath, List<File> files) throws Exception { 
List<File> result = new ArrayList<File>(); 
File fileOut = null ; 
InputStream is = null ; 
FileOutputStream os = null ; 
try { 
if(connectServer(this.getIp(), this.getPort(), this.getUser(), this.getPwd())) { 
ftpClient.changeWorkingDirectory(remotePath); 
FTPFile[] ftpFiles = ftpClient.listFiles(); 

for(FTPFile file : ftpFiles) { 
is = ftpClient.retrieveFileStream(file.getName()); 
if(localPath != null && !localPath.endsWith(File.separator)) { 
localPath = localPath + File.separator; 
File path = new File(localPath); 
if(!path.exists()) { 
path.mkdirs(); 
} 
} 
fileOut = new File(localPath + file.getName()); 
os = new FileOutputStream(fileOut); 
byte[] bytes = new byte[1024]; 
int c ; 
while((c=is.read(bytes)) != -1) { 
os.write(bytes, 0, c); 
} 

result.add(fileOut); 
ftpClient.completePendingCommand(); 
os.flush(); 
is.close(); 
os.close(); 
} 

for(FTPFile file : ftpFiles) { 
ftpClient.deleteFile(file.getName()); 
} 
} 
} catch(Exception e) { 
logger.error("从FTP服务器下载文件异常:", e); 
} finally { 
ftpClient.logout(); 
if(ftpClient.isConnected()) { 
ftpClient.disconnect(); 
} 
} 

return result; 
} 

/** 
* FTP上传文件 
* @param remotePath 
* @param localPath 
* @param files 
* @return 
* @throws Exception 
*/ 
public File uploadFile(String remotePath, List<File> files) throws Exception { 
File fileIn = null; 
OutputStream os = null; 
FileInputStream is = null; 
try { 
for(File file : files) { 
if(connectServer(this.getIp(), this.getPort(), this.getUser(), this.getPwd())) { 
ftpClient.changeWorkingDirectory(remotePath); 
os = ftpClient.storeFileStream(file.getName()); 
fileIn = file; 
is = new FileInputStream(fileIn); 
byte[] bytes = new byte[1024]; 
int c ; 
while((c=is.read(bytes)) != -1) { 
os.write(bytes, 0, c); 
} 
} 
} 
} catch(Exception e) { 
logger.error("上传FTP文件异常: ", e); 
} finally { 
os.close() ; 
is.close(); 
ftpClient.logout(); 
if(ftpClient.isConnected()) { 
ftpClient.disconnect(); 
} 
} 

return fileIn; 
} 

public String getIp() { 
return ip; 
} 

public void setIp(String ip) { 
this.ip = ip; 
} 

public int getPort() { 
return port; 
} 

public void setPort(int port) { 
this.port = port; 
} 

public String getPwd() { 
return pwd; 
} 

public void setPwd(String pwd) { 
this.pwd = pwd; 
} 

public String getUser() { 
return user; 
} 

public void setUser(String user) { 
this.user = user; 
} 
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值