sftp 上傳文件_2

 

 

1 官方API查看地址(附件爲需要的jar)


http://www.jcraft.com/jsch/

 

2 api常用的方法:


put():      文件上傳
get():      文件下載
cd():       進入指定目錄
ls():       得到指定目錄下的文件列表
rename():   重命名指定文件或目錄
rm():       刪除指定文件
mkdir():    創建目錄
rmdir():    刪除目錄
put和get都有多個重載方法,自己看源代碼

 

3 對常用方法的使用,封裝成一個util類

import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Properties;  
import java.util.Vector;  
  
import org.apache.log4j.Logger;  
  
import com.jcraft.jsch.Channel;  
import com.jcraft.jsch.ChannelSftp;  
import com.jcraft.jsch.JSch;  
import com.jcraft.jsch.Session;  
import com.jcraft.jsch.SftpATTRS;  
import com.jcraft.jsch.SftpException;  
import com.jcraft.jsch.ChannelSftp.LsEntry;  
/** 
 * sftp工具類 
 *  
 * @author 一隻蔡狗 
 * @date 2020-6-06 
 * @time 下午1:39:44 
 * @version 1.0 
 */  
public class SFTPUtils  
{  
    private static Logger log = Logger.getLogger(SFTPUtils.class.getName());  
  
    private String host;//服務器連接ip  
    private String username;//用戶名  
    private String password;//密碼  
    private int port = 22;//端口號  
    private ChannelSftp sftp = null;  
    private Session sshSession = null;  
  
    public SFTPUtils(){}  
  
    public SFTPUtils(String host, int port, String username, String password)  
    {  
        this.host = host;  
        this.username = username;  
        this.password = password;  
        this.port = port;  
    }  
  
    public SFTPUtils(String host, String username, String password)  
    {  
        this.host = host;  
        this.username = username;  
        this.password = password;  
    }  
  
    /** 
     * 通過SFTP連接服務器 
     */  
    public void connect()  
    {  
        try  
        {  
            JSch jsch = new JSch();  
            jsch.getSession(username, host, port);  
            sshSession = jsch.getSession(username, host, port);  
            if (log.isInfoEnabled())  
            {  
                log.info("Session created.");  
            }  
            sshSession.setPassword(password);  
            Properties sshConfig = new Properties();  
            sshConfig.put("StrictHostKeyChecking", "no");  
            sshSession.setConfig(sshConfig);  
            sshSession.connect();  
            if (log.isInfoEnabled())  
            {  
                log.info("Session connected.");  
            }  
            Channel channel = sshSession.openChannel("sftp");  
            channel.connect();  
            if (log.isInfoEnabled())  
            {  
                log.info("Opening Channel.");  
            }  
            sftp = (ChannelSftp) channel;  
            if (log.isInfoEnabled())  
            {  
                log.info("Connected to " + host + ".");  
            }  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 關閉連接 
     */  
    public void disconnect()  
    {  
        if (this.sftp != null)  
        {  
            if (this.sftp.isConnected())  
            {  
                this.sftp.disconnect();  
                if (log.isInfoEnabled())  
                {  
                    log.info("sftp is closed already");  
                }  
            }  
        }  
        if (this.sshSession != null)  
        {  
            if (this.sshSession.isConnected())  
            {  
                this.sshSession.disconnect();  
                if (log.isInfoEnabled())  
                {  
                    log.info("sshSession is closed already");  
                }  
            }  
        }  
    }  
  
    /** 
     * 批量下載文件 
     * @param remotPath:遠程下載目錄(以路徑符號結束,可以爲相對路徑eg:/assess/sftp/jiesuan_2/2020/) 
     * @param localPath:本地保存目錄(以路徑符號結束,D:\Duansha\sftp\) 
     * @param fileFormat:下載文件格式(以特定字符開頭,爲空不做檢驗) 
     * @param fileEndFormat:下載文件格式(文件格式) 
     * @param del:下載後是否刪除sftp文件 
     * @return 
     */  
    public List<String> batchDownLoadFile(String remotePath, String localPath,  
            String fileFormat, String fileEndFormat, boolean del)  
    {  
        List<String> filenames = new ArrayList<String>();  
        try  
        {  
            // connect();  
            Vector v = listFiles(remotePath);  
            // sftp.cd(remotePath);  
            if (v.size() > 0)  
            {  
                System.out.println("本次處理文件個數不爲零,開始下載...fileSize=" + v.size());  
                Iterator it = v.iterator();  
                while (it.hasNext())  
                {  
                    LsEntry entry = (LsEntry) it.next();  
                    String filename = entry.getFilename();  
                    SftpATTRS attrs = entry.getAttrs();  
                    if (!attrs.isDir())  
                    {  
                        boolean flag = false;  
                        String localFileName = localPath + filename;  
                        fileFormat = fileFormat == null ? "" : fileFormat  
                                .trim();  
                        fileEndFormat = fileEndFormat == null ? ""  
                                : fileEndFormat.trim();  
                        // 三種情況  
                        if (fileFormat.length() > 0 && fileEndFormat.length() > 0)  
                        {  
                            if (filename.startsWith(fileFormat) && filename.endsWith(fileEndFormat))  
                            {  
                                flag = downloadFile(remotePath, filename,localPath, filename);  
                                if (flag)  
                                {  
                                    filenames.add(localFileName);  
                                    if (flag && del)  
                                    {  
                                        deleteSFTP(remotePath, filename);  
                                    }  
                                }  
                            }  
                        }  
                        else if (fileFormat.length() > 0 && "".equals(fileEndFormat))  
                        {  
                            if (filename.startsWith(fileFormat))  
                            {  
                                flag = downloadFile(remotePath, filename, localPath, filename);  
                                if (flag)  
                                {  
                                    filenames.add(localFileName);  
                                    if (flag && del)  
                                    {  
                                        deleteSFTP(remotePath, filename);  
                                    }  
                                }  
                            }  
                        }  
                        else if (fileEndFormat.length() > 0 && "".equals(fileFormat))  
                        {  
                            if (filename.endsWith(fileEndFormat))  
                            {  
                                flag = downloadFile(remotePath, filename,localPath, filename);  
                                if (flag)  
                                {  
                                    filenames.add(localFileName);  
                                    if (flag && del)  
                                    {  
                                        deleteSFTP(remotePath, filename);  
                                    }  
                                }  
                            }  
                        }  
                        else  
                        {  
                            flag = downloadFile(remotePath, filename,localPath, filename);  
                            if (flag)  
                            {  
                                filenames.add(localFileName);  
                                if (flag && del)  
                                {  
                                    deleteSFTP(remotePath, filename);  
                                }  
                            }  
                        }  
                    }  
                }  
            }  
            if (log.isInfoEnabled())  
            {  
                log.info("download file is success:remotePath=" + remotePath  
                        + "and localPath=" + localPath + ",file size is"  
                        + v.size());  
            }  
        }  
        catch (SftpException e)  
        {  
            e.printStackTrace();  
        }  
        finally  
        {  
            // this.disconnect();  
        }  
        return filenames;  
    }  
  
    /** 
     * 下載單個文件 
     * @param remotPath:遠程下載目錄(以路徑符號結束) 
     * @param remoteFileName:下載文件名 
     * @param localPath:本地保存目錄(以路徑符號結束) 
     * @param localFileName:保存文件名 
     * @return 
     */  
    public boolean downloadFile(String remotePath, String remoteFileName,String localPath, String localFileName)  
    {  
        FileOutputStream fieloutput = null;  
        try  
        {  
            // sftp.cd(remotePath);  
            File file = new File(localPath + localFileName);  
            // mkdirs(localPath + localFileName);  
            fieloutput = new FileOutputStream(file);  
            sftp.get(remotePath + remoteFileName, fieloutput);  
            if (log.isInfoEnabled())  
            {  
                log.info("===DownloadFile:" + remoteFileName + " success from sftp.");  
            }  
            return true;  
        }  
        catch (FileNotFoundException e)  
        {  
            e.printStackTrace();  
        }  
        catch (SftpException e)  
        {  
            e.printStackTrace();  
        }  
        finally  
        {  
            if (null != fieloutput)  
            {  
                try  
                {  
                    fieloutput.close();  
                }  
                catch (IOException e)  
                {  
                    e.printStackTrace();  
                }  
            }  
        }  
        return false;  
    }  
  
    /** 
     * 上傳單個文件 
     * @param remotePath:遠程保存目錄 
     * @param remoteFileName:保存文件名 
     * @param localPath:本地上傳目錄(以路徑符號結束) 
     * @param localFileName:上傳的文件名 
     * @return 
     */  
    public boolean uploadFile(String remotePath, String remoteFileName,String localPath, String localFileName)  
    {  
        FileInputStream in = null;  
        try  
        {  
            createDir(remotePath);  
            File file = new File(localPath + localFileName);  
            in = new FileInputStream(file);  
            sftp.put(in, remoteFileName);  
            return true;  
        }  
        catch (FileNotFoundException e)  
        {  
            e.printStackTrace();  
        }  
        catch (SftpException e)  
        {  
            e.printStackTrace();  
        }  
        finally  
        {  
            if (in != null)  
            {  
                try  
                {  
                    in.close();  
                }  
                catch (IOException e)  
                {  
                    e.printStackTrace();  
                }  
            }  
        }  
        return false;  
    }  
  
    /** 
     * 批量上傳文件 
     * @param remotePath:遠程保存目錄 
     * @param localPath:本地上傳目錄(以路徑符號結束) 
     * @param del:上傳後是否刪除本地文件 
     * @return 
     */  
    public boolean bacthUploadFile(String remotePath, String localPath,  
            boolean del)  
    {  
        try  
        {  
            connect();  
            File file = new File(localPath);  
            File[] files = file.listFiles();  
            for (int i = 0; i < files.length; i++)  
            {  
                if (files[i].isFile()  
                        && files[i].getName().indexOf("bak") == -1)  
                {  
                    if (this.uploadFile(remotePath, files[i].getName(),  
                            localPath, files[i].getName())  
                            && del)  
                    {  
                        deleteFile(localPath + files[i].getName());  
                    }  
                }  
            }  
            if (log.isInfoEnabled())  
            {  
                log.info("upload file is success:remotePath=" + remotePath  
                        + "and localPath=" + localPath + ",file size is "  
                        + files.length);  
            }  
            return true;  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
        finally  
        {  
            this.disconnect();  
        }  
        return false;  
  
    }  
  
    /** 
     * 刪除本地文件 
     * @param filePath 
     * @return 
     */  
    public boolean deleteFile(String filePath)  
    {  
        File file = new File(filePath);  
        if (!file.exists())  
        {  
            return false;  
        }  
  
        if (!file.isFile())  
        {  
            return false;  
        }  
        boolean rs = file.delete();  
        if (rs && log.isInfoEnabled())  
        {  
            log.info("delete file success from local.");  
        }  
        return rs;  
    }  
  
    /** 
     * 創建目錄 
     * @param createpath 
     * @return 
     */  
    public boolean createDir(String createpath)  
    {  
        try  
        {  
            if (isDirExist(createpath))  
            {  
                this.sftp.cd(createpath);  
                return true;  
            }  
            String pathArry[] = createpath.split("/");  
            StringBuffer filePath = new StringBuffer("/");  
            for (String path : pathArry)  
            {  
                if (path.equals(""))  
                {  
                    continue;  
                }  
                filePath.append(path + "/");  
                if (isDirExist(filePath.toString()))  
                {  
                    sftp.cd(filePath.toString());  
                }  
                else  
                {  
                    // 建立目錄  
                    sftp.mkdir(filePath.toString());  
                    // 進入並設置爲當前目錄  
                    sftp.cd(filePath.toString());  
                }  
  
            }  
            this.sftp.cd(createpath);  
            return true;  
        }  
        catch (SftpException e)  
        {  
            e.printStackTrace();  
        }  
        return false;  
    }  
  
    /** 
     * 判斷目錄是否存在 
     * @param directory 
     * @return 
     */  
    public boolean isDirExist(String directory)  
    {  
        boolean isDirExistFlag = false;  
        try  
        {  
            SftpATTRS sftpATTRS = sftp.lstat(directory);  
            isDirExistFlag = true;  
            return sftpATTRS.isDir();  
        }  
        catch (Exception e)  
        {  
            if (e.getMessage().toLowerCase().equals("no such file"))  
            {  
                isDirExistFlag = false;  
            }  
        }  
        return isDirExistFlag;  
    }  
  
    /** 
     * 刪除stfp文件 
     * @param directory:要刪除文件所在目錄 
     * @param deleteFile:要刪除的文件 
     * @param sftp 
     */  
    public void deleteSFTP(String directory, String deleteFile)  
    {  
        try  
        {  
            // sftp.cd(directory);  
            sftp.rm(directory + deleteFile);  
            if (log.isInfoEnabled())  
            {  
                log.info("delete file success from sftp.");  
            }  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 如果目錄不存在就創建目錄 
     * @param path 
     */  
    public void mkdirs(String path)  
    {  
        File f = new File(path);  
  
        String fs = f.getParent();  
  
        f = new File(fs);  
  
        if (!f.exists())  
        {  
            f.mkdirs();  
        }  
    }  
  
    /** 
     * 列出目錄下的文件 
     *  
     * @param directory:要列出的目錄 
     * @param sftp 
     * @return 
     * @throws SftpException 
     */  
    public Vector listFiles(String directory) throws SftpException  
    {  
        return sftp.ls(directory);  
    }  
  
    public String getHost()  
    {  
        return host;  
    }  
  
    public void setHost(String host)  
    {  
        this.host = host;  
    }  
  
    public String getUsername()  
    {  
        return username;  
    }  
  
    public void setUsername(String username)  
    {  
        this.username = username;  
    }  
  
    public String getPassword()  
    {  
        return password;  
    }  
  
    public void setPassword(String password)  
    {  
        this.password = password;  
    }  
  
    public int getPort()  
    {  
        return port;  
    }  
  
    public void setPort(int port)  
    {  
        this.port = port;  
    }  
  
    public ChannelSftp getSftp()  
    {  
        return sftp;  
    }  
  
    public void setSftp(ChannelSftp sftp)  
    {  
        this.sftp = sftp;  
    }  
      
    /**測試*/  
    public static void main(String[] args)  
    {  
        SFTPUtils sftp = null;  
        // 本地存放地址  
        String localPath = "D:/tomcat5/webapps/ASSESS/DocumentsDir/DocumentTempDir/txtData/";  
        // Sftp下載路徑  
        String sftpPath = "/home/assess/sftp/jiesuan_2/2014/";  
        List<String> filePathList = new ArrayList<String>();  
        try  
        {  
            sftp = new SFTPUtils("10.163.201.115", "tdcp", "tdcp");  
            sftp.connect();  
            // 下載  
            sftp.batchDownLoadFile(sftpPath, localPath, "ASSESS", ".txt", true);  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
        finally  
        {  
            sftp.disconnect();  
        }  
    }  
}  

時間輔助類

/** 
 * 時間處理工具類(簡單的) 
 * @author 一隻蔡狗 
 * @date 2020-6-06
 * @time 下午1:39:44 
 * @version 1.0 
 */  
public class DateUtil {  
     /** 
     * 默認時間字符串的格式 
     */  
    public static final String DEFAULT_FORMAT_STR = "yyyyMMddHHmmss";  
      
    public static final String DATE_FORMAT_STR = "yyyyMMdd";  
      
    /** 
     * 獲取系統時間的昨天 
     * @return 
     */  
    public static String getSysTime(){  
         Calendar ca = Calendar.getInstance();     
         ca.set(Calendar.DATE, ca.get(Calendar.DATE)-1);  
         Date d = ca.getTime();  
         SimpleDateFormat sdf =  new SimpleDateFormat("yyyyMMdd");  
         String a = sdf.format(d);  
        return a;  
    }  
      
    /** 
     * 獲取當前時間 
     * @param date 
     * @return 
     */  
    public static String getCurrentDate(String formatStr)  
    {  
        if (null == formatStr)  
        {  
            formatStr=DEFAULT_FORMAT_STR;  
        }  
        return date2String(new Date(), formatStr);  
    }  
      
    /** 
     * 返回年月日 
     * @return yyyyMMdd 
     */  
    public static String getTodayChar8(String dateFormat){  
        return DateFormatUtils.format(new Date(), dateFormat);  
    }  
      
    /** 
     * 將Date日期轉換爲String 
     * @param date 
     * @param formatStr 
     * @return 
     */  
    public static String date2String(Date date, String formatStr)  
    {  
        if (null == date || null == formatStr)  
        {  
            return "";  
        }  
        SimpleDateFormat df = new SimpleDateFormat(formatStr);  
  
        return df.format(date);  
    }  
}  

 

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