ftp链接服务器

package com.pridecn.common.util;

import org.apache.commons.io.IOUtils;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Component
public class FtpUtils {

    private static Logger logger = LoggerFactory.getLogger(FtpUtils.class);

    @Autowired
    private FtpBean ftpBean;

    /**
     * ftp服务器地址
     */
    @Value("${ftp.hostname}")
    public String hostname ;

    /**
     * ftp服务器端口号默认为21
     */
    @Value("${ftp.port}")
    public Integer port ;

    /**
     * ftp登录账号
     */
    @Value("${ftp.username}")
    public String username ;

    /**
     * ftp登录密码
     */
    @Value("${ftp.password}")
    public String password ;

    public FTPClient ftpClient = null;

    /**
     * 初始化ftp服务器
     */
    public void initFtpClient() {
        ftpClient = new FTPClient();
        ftpClient.setControlEncoding("utf-8");
        try {
            logger.info("connecting...ftp服务器:"+this.hostname+":"+this.port);
            // 连接ftp服务器
            ftpClient.connect(hostname, port);
            // 登录ftp服务器
            ftpClient.login(username, password);
            // 是否成功登录服务器
            int replyCode = ftpClient.getReplyCode();
            if(!FTPReply.isPositiveCompletion(replyCode)){
                logger.info("connect failed...ftp服务器:"+this.hostname+":"+this.port);
            }else{
                logger.info("connect successful...ftp服务器:"+this.hostname+":"+this.port);
            }

        }catch (MalformedURLException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传文件
     * @param pathname ftp服务保存地址
     * @param fileName 上传到ftp的文件名
     *  @param originfilename 待上传文件的名称(绝对地址) *
     * @return
     */
    public boolean uploadFile( String pathname, String fileName,String originfilename){
        boolean flag = false;
        InputStream inputStream = null;
        try{
            logger.info("*********开始上传文件*********");
            inputStream = new FileInputStream(new File(originfilename));
            initFtpClient();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            CreateDirecroty(pathname);
            ftpClient.makeDirectory(pathname);
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.storeFile(fileName, inputStream);
            inputStream.close();
            ftpClient.logout();
            flag = true;
            logger.info("*********上传文件成功*************");
        }catch (Exception e) {
            logger.info("*********上传文件失败*************");
            e.printStackTrace();
        }finally{
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(null != inputStream){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    /**
     * 上传文件
     * @param pathname ftp服务保存地址
     * @param fileName 上传到ftp的文件名
     * @param inputStream 输入文件流
     * @return
     */
    public boolean uploadFile( String pathname, String fileName,InputStream inputStream){
        boolean flag = false;
        try{
            logger.info("*********开始上传文件*********");
            initFtpClient();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            CreateDirecroty(pathname);
            ftpClient.makeDirectory(pathname);
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.storeFile(fileName, inputStream);
            inputStream.close();
            ftpClient.logout();
            flag = true;
            logger.info("*********上传文件成功*********");
        }catch (Exception e) {
            logger.info("*********上传文件失败*********");
            e.printStackTrace();
        }finally{
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(null != inputStream){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    /**
     * 改变目录路径
     */
    public boolean changeWorkingDirectory(String directory) {
        boolean flag = true;
        try {
            flag = ftpClient.changeWorkingDirectory(directory);
            if (flag) {
                logger.info("进入文件夹" + directory + " 成功!");
            } else {
                logger.info("进入文件夹" + directory + " 失败!开始创建文件夹");
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return flag;
    }

    /**
     * 创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
     */
    public boolean CreateDirecroty(String remote) throws IOException {
        boolean success = true;
        String directory = remote + "/";
        // 如果远程目录不存在,则递归创建远程服务器目录
        if (!"/".equalsIgnoreCase(directory) && !changeWorkingDirectory(new String(directory))) {
            int start = 0;
            int end = 0;
            if (directory.startsWith("/")) {
                start = 1;
            } else {
                start = 0;
            }
            end = directory.indexOf("/", start);
            String path = "";
            String paths = "";
            while (true) {
                String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");
                path = path + "/" + subDirectory;
                if (!existFile(path)) {
                    if (makeDirectory(subDirectory)) {
                        changeWorkingDirectory(subDirectory);
                    } else {
                        logger.info("创建目录[" + subDirectory + "]失败");
                        changeWorkingDirectory(subDirectory);
                    }
                } else {
                    changeWorkingDirectory(subDirectory);
                }

                paths = paths + "/" + subDirectory;
                start = end + 1;
                end = directory.indexOf("/", start);
                // 检查所有目录是否创建完毕
                if (end <= start) {
                    break;
                }
            }
        }
        return success;
    }

    /**
     * 判断ftp服务器文件是否存在
     */
    public boolean existFile(String path) throws IOException {
        boolean flag = false;
        FTPFile[] ftpFileArr = ftpClient.listFiles(path);
        if (ftpFileArr.length > 0) {
            flag = true;
        }
        return flag;
    }

    /**
     * 创建目录
     */
    public boolean makeDirectory(String dir) {
        boolean flag = true;
        try {
            flag = ftpClient.makeDirectory(dir);
            if (flag) {
                logger.info("创建文件夹" + dir + " 成功!");
            } else {
                logger.info("创建文件夹" + dir + " 失败!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /** * 下载文件 *
     * @param pathname FTP服务器文件目录 *
     * @param filename 文件名称 *
     * @param localpath 下载后的文件路径 *
     * @return */
    public  boolean downloadFile(String pathname, String filename, String localpath){
        boolean flag = false;
        OutputStream os=null;
        try {
            logger.info("************开始下载文件************");
            initFtpClient();
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            FTPFile[] ftpFiles = ftpClient.listFiles();
            for(FTPFile file : ftpFiles){
                if(filename.equalsIgnoreCase(file.getName())){
                    File localFile = new File(localpath + "/" + file.getName());
                    os = new FileOutputStream(localFile);
                    ftpClient.retrieveFile(file.getName(), os);
                    os.close();
                }
            }
            ftpClient.logout();
            flag = true;
            logger.info("************下载文件成功************");
        } catch (Exception e) {
            logger.info("************下载文件失败************");
            e.printStackTrace();
        } finally{
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(null != os){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    /** * 删除文件 *
     * @param pathname FTP服务器保存目录 *
     * @param filename 要删除的文件名称 *
     * @return */
    public boolean deleteFile(String pathname, String filename){
        boolean flag = false;
        try {
            logger.info("************开始删除文件************");
            initFtpClient();
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.deleteFile(filename);
            ftpClient.logout();
            flag = true;
            logger.info("************删除文件成功************");
        } catch (Exception e) {
            logger.info("************删除文件失败************");
            e.printStackTrace();
        } finally {
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    /**
     * 获取指定目录下的文件列表流 (根据文件名,只获取当天的文件)
     * @param pathname
     * @return
     */
    public List<byte[]> getFTPFilesInputStream(String pathname){
        List<byte[]> list = new ArrayList<>();
        Boolean flag = null;
        try {
            initFtpClient();
            flag = ftpClient.changeWorkingDirectory(pathname);
            if (flag) {
                logger.info("进入文件夹" + pathname + " 成功!");
            }else {
                throw new Exception("进入文件失败");
            }
            FTPFile[] ftpFiles = ftpClient.listFiles();
            //获取当天日期字符串,过滤服务器文件名使用
            String todayString = new SimpleDateFormat("yyyyMMdd").format(new Date());
            if (ftpFiles!=null&&ftpFiles.length>0){
                for(FTPFile file : ftpFiles){
                    //截取文件名中的日期
                    String[] arryName = file.getName().split("\\.");
                    String[] array = arryName[0].split("\\_");
                    //若不是当天记录 ,跳过加载
                    if(array!=null&&!array[2].contains(todayString)){
                        continue;
                    }
                    InputStream inputStream = ftpClient.retrieveFileStream(file.getName());
                    byte[]  bytes = IOUtils.toByteArray(inputStream);
                    //下边两行代码代码只管重要,不然会报空,返回的字节数组,调用后再转换成InputStream;inputStream = new ByteArrayInputStream(bytes);
                    inputStream.close();
                    ftpClient.completePendingCommand();
                    list.add(bytes);
                }
            }
            return list;
        } catch (Exception e) {
            logger.info("************进入文件失败************");
            e.printStackTrace();
            return new ArrayList<>();
        } finally{
            if(ftpClient.isConnected()){
                try{

                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 获取制定目录下的文件列表
     * @param pathname 目录
     * @return
     */
    public List<FTPFile> getFTPFiles(String pathname){
        List<FTPFile> list = new ArrayList<>();
        Boolean flag = null;
        try {
            initFtpClient();
            flag = ftpClient.changeWorkingDirectory(pathname);
            if (flag) {
                logger.info("进入文件夹" + pathname + " 成功!");
            }else {
                throw new Exception("进入文件失败");
            }
            FTPFile[] ftpFiles = ftpClient.listFiles();
            if (ftpFiles!=null&&ftpFiles.length>0) {
                for (FTPFile file : ftpFiles) {
                    list.add(file);
                }
            }
            return list;
        } catch (Exception e) {
            logger.info("************进入文件失败************");
            e.printStackTrace();
            return new ArrayList<>();
        } finally{
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

        public static void main(String[] args) {
        FtpUtils ftp =new FtpUtils();
        ftp.uploadFile("/home/aixiaosu/file/", "abc.gif", "D://abc.gif");
//        ftp.downloadFile("home/aixiaosu/file", "abc.gif", "D://a");
//        ftp.deleteFile("/home/aixiaosu/file", "abc.gif");
        logger.info("ok");
    }
}
 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值