apache.FTPClient 上传文件和文件夹,及FTPClient方法注释。

概述:

本文章主要是基于内容发布,通过FTPClient 将文件复制到另一台机器涉及多线程调用,和怎么上传文件和文件夹,及FTPClient 中的语法说明。

1.用到的jar

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

2. 构造方法

public class ftpsynchronization {

	private  FTPClient ftp;
	
    //默认端口21
    private final int port = 21;
    
    /**
     * 规避多线程并发不断开问题
     */
    private ThreadLocal<ftpsynchronization> ftpLocal = new ThreadLocal<ftpsynchronization>();

    /**
     * 获取ftp连接
     * @param map
     * @throws Exception
     */
    public void connectFtp(Map<String,Object> map) throws Exception {
        ftp = new FTPClient();
        int reply;
        //这个是从map中获取自定义端口
        Integer targetPort = CMSUtil.intFormat(CMSUtil.stringFormat(map.get("targetPort")));
        //判断自定义端口是否存在,不存在则获取默认端口21
        if (targetPort==0) {
         ftp.connect(CMSUtil.stringFormat(map.get("targetServer")),port);
        } else {
            ftp.connect(CMSUtil.stringFormat(map.get("targetServer")), targetPort);
        }
        //这个是从map中获取用户和密码
        ftp.login(CMSUtil.stringFormat(map.get("loginUser")), CMSUtil.stringFormat(map.get("loginPwd")));
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
        }
    }

    /**
     * 判断sftp是否连接
     *
     * @return
     */
    public boolean isChannel() {
        try {
            if (ftp.isConnected()) {
                return true;
            }
        } catch (Exception e) {
            logger.info(e.getMessage());
        }
        return false;
    }

    /**
     * 关闭ftp连接
     */
    public void closeFtp(ftpsynchronization ftpUtil) {
        if (ftpUtil.isChannel()) {
            ftpLocal.set(null);
            if (ftp != null && ftp.isConnected()) {
                try {
                    ftp.logout();
                    ftp.disconnect();
                } catch (IOException e) {
                   // logger.error("关闭ftp连接失败!");
                    //e.printStackTrace();
                }
            }
        }
    }

    /**
     * 当前所属系统
     *
     * @return
     */
    public static boolean systemtype() {
        boolean flag = false;
        String os = System.getProperty("os.name");
        if (os.toLowerCase().startsWith("win")) {
            flag = true;
        }
        return flag;
    }
    // super 构造这个类的方法
       private ftpsynchronization(Map<String,Object> map) throws Exception {
        super();
        connectFtp(map);
    }
    //获取 ftp链接
       public ftpsynchronization getftpUtil(Map<String,Object> map) throws Exception {
        ftpsynchronization ftpUtil = ftpLocal.get();
        if (null == ftpUtil || !ftpUtil.isChannel()) {
            ftpLocal.set(new ftpsynchronization(map));
        }
        return ftpLocal.get();
    }
   
    /**
     * 单个文件上传ftp
     * @param file
     * @param url
     * @throws Exception
     * @author ma.hualong
     */
    public void fileupload(File file, String url) throws Exception {
        FileInputStream input = new FileInputStream(file);
        //编码转换new String((file2.getName()).getBytes("UTF-8"), "iso-8859-1"),path可操作的绝对路径
        boolean b = ftp.storeFile(new String((url + file.getName()).getBytes("UTF-8"), ftp.DEFAULT_CONTROL_ENCODING), input);
        if (!b) {
            logger.error("文件上传:" + b + ",上传文件指向路径错误:" + url);
        }
        input.close();
    }

    /**
     * @param file 上传文件夹
     * @param url cd 上传文件夹的位置
     * @throws Exception
     */
    private void uploadDirectory(File file,String url) throws Exception{
        ftp.changeWorkingDirectory(url);
        if(file.isDirectory()){
            ftp.makeDirectory(file.getName());
            ftp.changeWorkingDirectory(file.getName());
            String[] files = file.list();
            for (int i = 0; i < files.length; i++) {
                File file1 = new File(file.getPath()+"\\"+files[i] );
                if(file1.isDirectory()){
                    //加上文件父目录
                    uploadDirectory(file1,url+"/"+file1.getParent());
                    ftp.changeToParentDirectory();
                }else{
                    File file2 = new File(file.getPath()+"\\"+files[i]);
                    FileInputStream input = new FileInputStream(file2);
                    ftp.storeFile(file2.getName(), input);
                    input.close();
                }
            }
        }
    }
  /**
     * 站点分发(仅发布站点/栏目首页)
     * 不需要同步附件和附图
     * @param map
     * @param localFile
     */
    public static void publishdistri(Map<String, Object> map, String localFile) {
    ftpsynchronization ftpUtil=null;
        try {
            //ftp的跟目录
            String dataPath = CMSUtil.stringFormat(map.get("dataPath"));
            //需要上传的新目录
            String newdatapah =dataPath+localFile.split("pub")[1];
            ftpsynchronization ftp = new ftpsynchronization();
            ftpUtil = ftp.getftpUtil(map);
            ftpUtil.copyFileNew(newdatapah, localFile);
        } catch (Exception e) {
            logger.error("仅发布站点/栏目首页FTP站分发错误"+e.getMessage());
            //e.printStackTrace();
        } finally {
            ftpUtil.closeFtp(ftpUtil);
        }
    }
     /**
     * ftp上传文件
     *
     * @param newFilePath ftp的文件路径
     * @param url需要复制的文件路径
     * @throws Exception
     */
    public void copyFileNew(String newFilePath, String url) throws Exception {
        /**
         * ftp.enterLocalPassiveMode();这个方法是每次数据连接之前,
         * 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
         * 当需要传送数据时, 服务器在命令链路上用PASV命令告诉客户端:“我打开了***X端口,你过来连接我”。
         * 于是客户端向服务器的***X端口发送连接请求,建立一条数据链 路来传送数据。
         * 注:对于中文路径需要进行处理转字节码
         */
        //判断附件不为为空
        File file = new File(url);
        if(file.exists()) {
            ftp.enterLocalPassiveMode();
            String[] dirs = null;
            String realPath = "";
            //ptf路径最后必须是/或\
            if (systemtype()) {
                newFilePath = newFilePath.replace("/", "\\");
                realPath = newFilePath.substring(0, newFilePath.lastIndexOf("\\") + 1);
                dirs = realPath.split("\\\\");
            } else {
                newFilePath = newFilePath.replace("\\", "/");
                realPath = newFilePath.substring(0, newFilePath.lastIndexOf("/") + 1);
                dirs = realPath.split("/");
            }
            String tempPath = "";
            for (String dir : dirs) {
                tempPath = dir;
                //如果是中文路径需要处理
                boolean changeWorkingDirectory = ftp.changeWorkingDirectory(new String(tempPath.getBytes("UTF-8"), ftp.DEFAULT_CONTROL_ENCODING));
                if (!changeWorkingDirectory) {
                    if (null == dir || "".equals(dir)) {
                        continue;
                    } else {
                        boolean makeDirectory = ftp.makeDirectory(tempPath);
                        if (!makeDirectory) {
                            logger.error("创建文件夹失败!");
                        }
                        boolean WorkingDirectory = ftp.changeWorkingDirectory(new String(tempPath.getBytes("UTF-8"), ftp.DEFAULT_CONTROL_ENCODING));
                        if (!WorkingDirectory) {
                            logger.error("进入当前目录失败!");
                        }
                    }
                } else {
                    continue;
                }
            }
            //ftp完成文件夹创建返回根目录,避免创建文件混乱情况。
            ftp.changeWorkingDirectory("/");
            fileupload(new File(url), realPath);
        }else{
            logger.info("文件"+url+"找不到,FTP站点分发失败");
        }
    }
}

你可能感兴趣的:(服务器,java,ftp)