java實現ftp/sftp上傳下載

1、ftp

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;
import java.util.List;
import java.util.Map;

public class FtpUtils {
    private static FTPClient ftpClient;

    /**
     * 獲取ftpClient
     * @param host 主機ip
     * @param port 端口號
     * @param username ftp用戶名
     * @param password ftp密碼
     * @return FTPClient對象
     */
    private static FTPClient getFTPClient(String host,int port,String username,String password) {
        ftpClient = new FTPClient();
        try {
            //連接ftp服務器
            ftpClient.connect(host, port);
            //登錄ftp
            ftpClient.login(username, password);
        } catch (IOException e) {
            LogUtil.error("連接ftp服務器異常!",e);
            return ftpClient;
        }

        //設置編碼方式
        ftpClient.setControlEncoding("UTF-8");
        try {
            //設置文件類型,二進制文件
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        } catch (IOException e) {
            LogUtil.error("設置文件類型異常!",e);
            return ftpClient;
        }
        //設置被動模式(默認方式)
        ftpClient.enterLocalPassiveMode();
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            //連接失敗
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                LogUtil.error("關閉ftpClient異常!",e);
            }
        } else {
            LogUtil.info("ftp連接成功!");
        }
        return ftpClient;
    }

    private static void free(){
        try {
            ftpClient.logout();
            ftpClient.disconnect();
            LogUtil.info("ftp斷開連接!");
        } catch (IOException e) {
            LogUtil.error("ftpClient連接關閉異常",e);
        }
    }

    /**
     * ftp多文件上傳
     * @param host 主機ip
     * @param port 主機端口號
     * @param username ftp用戶名
     * @param password ftp密碼
     * @param remotePath 遠程目錄
     * @param localPathList 本地文件路徑集合,每個元素爲帶文件名的全路徑
     * @return 上傳成功的文件個數
     */
    public static int uploadMultipleFile(String host, int port, String username, String password, String remotePath, List<String> localPathList){
        final int ZERO = 0;
        int successNum = 0;

        //連接ftp客戶端
        FTPClient ftpClient = getFTPClient(host, port, username, password);
        //切換工作路徑
        try {
            ftpClient.changeWorkingDirectory(remotePath);
        } catch (IOException e) {
            LogUtil.error("遠程路徑錯誤:"+remotePath,e);
            return ZERO;
        }
        int reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            LogUtil.info("ftpClient未準備就緒,即將斷開連接!");
            free();
            return ZERO;
        }else{
            //準備就緒,開始上傳文件
            ftpClient.enterLocalActiveMode();
            String fileName = null;
            for (String localPath : localPathList) {
                try(InputStream in = new FileInputStream(localPath);) {
                    //去除路徑,獲取文件名
                    fileName = localPath.substring(localPath.lastIndexOf("/")+1, localPath.length());
                    //上傳時文件名支持中文
                    fileName = new String(fileName.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
                    //上傳文件
                    if (ftpClient.storeFile(fileName, in)) {
                        LogUtil.info("文件上傳成功:"+localPath);
                        successNum++;
                    }else{
                        LogUtil.info("文件上傳失敗:"+localPath);
                    }
                } catch (IOException e) {
                    LogUtil.error("文件上傳失敗:"+localPath,e);
                }
            }
            free();
        }


        return successNum;
    }


    /**
     * 多文件下載
     * @param host 主機ip
     * @param port 端口號
     * @param username sftp用戶名
     * @param password sftp密碼
     * @param srcToDstMap 每個元素的key爲帶文件名的遠程全路徑,value爲帶文件名的本地全路徑
     * @return 下載成功的個數
     */
    public static int downloadMultipleFile(String host, int port, String username, String password, Map<String,String> srcToDstMap){
        int successNum = 0;
        final int ZERO = 0;
        //連接ftp客戶端
        FTPClient ftpClient = getFTPClient(host, port, username, password);

        int reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            LogUtil.info("ftpClient未準備就緒,即將斷開連接!");
            free();
            return ZERO;
        }else{
            for (Map.Entry<String, String> entry : srcToDstMap.entrySet()) {
                String src = entry.getKey();
                String srcForLog = src;
                try(OutputStream out = new FileOutputStream(entry.getValue())){
                    src = new String(src.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
                    if(ftpClient.retrieveFile(src, out)){
                        successNum++;
                        LogUtil.info("ftp下載成功:"+srcForLog);
                    }else{
                        LogUtil.info("ftp下載失敗:"+srcForLog);
                    }
                } catch (Exception e) {
                    LogUtil.error("ftp下載失敗:"+srcForLog, e);
                }

            }
            free();
            return successNum;
        }

    }

}

 

2、sftp

import com.jcraft.jsch.*;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Properties;


@Component
public class SftpUtil {
    

    
    private ChannelSftp sftp = null;
    

    public ChannelSftp  getconnect(String host, String username, String password,int port) {
        try {
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            Session sshSession = jsch.getSession(username, host, port);
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            LogUtil.info("sftp登錄成功!");
        } catch (Exception e) {
            LogUtil.error("sftp登錄失敗!" + e);
        }

        return sftp;

    }

    public void disconnect() {
        if (this.sftp != null) {
            if (this.sftp.isConnected()) {
                this.sftp.disconnect();
            } else if (this.sftp.isClosed()) {
                LogUtil.debug("sftp is closed already");
            }
        }
    }
    


    /**
     * 流行的
     * sftp多文件上傳
     * @param ip 主機ip
     * @param port 主機端口號
     * @param username sftp用戶名
     * @param password sftp密碼
     * @param remotePath 遠程目錄
     * @param localPathArr 本地文件路徑集合,每個元素爲帶文件名的全路徑
     * @return 上傳成功的文件個數
     */
    public static int uploadMultipleFile(String ip,int port,String username,String password,String remotePath,List<String> localPathList){
        SftpUtil sftpUtil = new SftpUtil();
        ChannelSftp channelSftp = sftpUtil.getconnect(ip, password, username, port);
        if(null == channelSftp || !channelSftp.isConnected()){
            LogUtil.info("多文件上傳失敗,sftp登錄失敗!");
            return 0;
        }
        try {
            channelSftp.cd(remotePath);
        } catch (SftpException e) {
            LogUtil.error("遠程路徑不存在",e);
            sftpUtil.disconnect();
            return 0;
        }

        //上傳成功的文件個數
        int successNum = 0;
        for (String localPath : localPathList) {
            File localFile = new File(localPath);
            try(InputStream in = new FileInputStream(localFile)) {
                channelSftp.put(in, localFile.getName());
                successNum++;
            } catch (Exception e) {
                LogUtil.error("文件上傳失敗",e);
            }

        }
        sftpUtil.disconnect();
        return successNum;
    }


    /**
     * 多文件下載
     * @param ip 主機ip
     * @param port 端口號
     * @param username sftp用戶名
     * @param password sftp密碼
     * @param srcToDstMap 每個元素的key爲帶文件名的遠程全路徑,value爲帶文件名的本地全路徑
     * @return
     */
    public static int downloadMultipleFile(String ip,int port,String username,String password,Map<String,String> srcToDstMap){
        SftpUtil sftpUtil = new SftpUtil();
        ChannelSftp channelSftp = sftpUtil.getconnect(ip, password, username, port);
        if(null == channelSftp || !channelSftp.isConnected()){
            LogUtil.info("多文件上傳失敗,sftp登錄失敗!");
            return 0;
        }

        int successNum = 0;
        for (Map.Entry<String, String> entry : srcToDstMap.entrySet()) {
            String src = entry.getKey();
            String dst = entry.getValue();
            File srcFile = new File(src);
            /*if(!srcFile.isFile()){
                LogUtil.error(src+"不是一個文件");
                continue;
            }*/
            try {
                channelSftp.get(src, dst);
            } catch (SftpException e) {
                LogUtil.error("sftp下載文件失敗:"+dst,e);
                continue;
            }
            LogUtil.info("sftp下載文件成功:"+dst);
            successNum++;
        }
        sftpUtil.disconnect();
        return successNum;

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章