JAVA Sftp 上传下载

SftpUtils


package xxx;import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;

/**
 * sftp工具类
 * Created by wdj on 2017/5/26.
 *  
 */
public class SftpUtils
{
    private static Logger log = LoggerFactory.getLogger(SftpUtils.class);

    private String host;
    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 boolean connect()
    {
        try
        {
            JSch jsch = new JSch();
            sshSession = jsch.getSession(username, host, port);
            sshSession.setPassword(password);

            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            if (log.isInfoEnabled())
            {
                log.info("jsch Session connected.");
            }

            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            if (log.isInfoEnabled())
            {
                log.info("jsch Opening sftp Channel.");
            }

            sftp = (ChannelSftp) channel;
            if (log.isInfoEnabled())
            {
                log.info("Connected to " + host + ".");
            }

            return true;
        }
        catch (Exception e)
        {
            log.error(" sftp 连接超时...{}", e.getMessage());
        }

        return false;
    }

    /**
     *  * 关闭连接
     *  
     */
    public void disconnect()
    {
        if (this.sftp != null)
        {
            if (this.sftp.isConnected())
            {
                this.sftp.disconnect();
                if (log.isInfoEnabled())
                {
                    log.info(" sftp is closed");
                }
            }
        }
        if (this.sshSession != null)
        {
            if (this.sshSession.isConnected())
            {
                this.sshSession.disconnect();
                if (log.isInfoEnabled())
                {
                    log.info(" sshSession is closed");
                }
            }
        }
    }

    /**
     *  * 批量下载文件
     *  * @param remotPath:远程下载目录(以路径符号结束,可以为相对路径eg: /home/sftp/2014/)
     *  * @param localPath:本地保存目录(以路径符号结束,D:\downloac\sftp\)
     *  * @param prefix:文件名开头
     *  * @param suffix:文件名结尾
     *  * @param delRemote:下载后是否删除sftp文件
     *  * @return
     *  
     */
    public List<String> downloadFiles(String remotePath, String localPath, String prefix, String suffix, boolean delRemote)
    {
        List<String> downfiles = new ArrayList<String>();
        try
        {
            Vector v = listFiles(remotePath);

            if (v.size() > 0)
            {
                prefix = prefix == null ? "" : prefix.trim();
                suffix = suffix == null ? "" : suffix.trim();

                boolean isDown;
                Iterator it = v.iterator();
                while (it.hasNext())
                {
                    LsEntry entry = (LsEntry) it.next();
                    String filename = entry.getFilename();
                    SftpATTRS attrs = entry.getAttrs();
                    if (!attrs.isDir())
                    {
                        File localFile = new File(localPath, filename);
                        // 验证开头和结尾
                        if ((prefix.equals("") || filename.startsWith(prefix)) && (suffix.equals("") || filename.endsWith(suffix)))
                        {
                            isDown = downloadFile(remotePath, filename, localFile);
                            if (isDown)
                            {
                                downfiles.add(localFile.getName());
                                if (delRemote)
                                    deleteSFTP(remotePath, filename);
                            }
                        }
                    }
                }

                if (log.isInfoEnabled())
                {
                    log.info("file download success,file size : {}", downfiles.size());
                }
            }
        }
        catch (SftpException e)
        {
            e.printStackTrace();
        }
        finally

        {
            // this.disconnect();
        }
        return downfiles;
    }

    /**
     * 下载单个文件
     *
     * @param remotePath
     * @param remoteFileName
     * @param localFile
     * @return
     */
    public boolean downloadFile(String remotePath, String remoteFileName, File localFile)
    {
        //FileOutputStream fieloutput = null;
        try
        {
            // sftp.cd(remotePath);
            // mkdirs(localPath + localFileName);
            //fieloutput = new FileOutputStream(localFile);

            // sftp.get(remotePath + remoteFileName, fieloutput);
            sftp.get(remotePath + remoteFileName, localFile.getAbsolutePath());

            log.info("=== file.download: [{}] success.", remoteFileName);
            return true;
        }
        catch (Exception e)
        {
            if (e.getMessage().toLowerCase().equals("no such file"))
            {
                if (log.isDebugEnabled())
                {
                    log.debug("=== file.download.error: [{}], {}.", remoteFileName, e.getMessage());
                }
            }
            else
                log.error("=== file.download.error: [{}], {}.", remoteFileName, e.getMessage());

            localFile.delete();
        }
        finally
        {
            //            if (null != fieloutput)
            //            {
            //                try
            //                {
            //                    fieloutput.close();
            //                }
            //                catch (IOException e)
            //                {
            //                }
            //            }
        }
        return false;
    }

    /**
     *  * 上传单个文件
     *  * @param remotePath:远程保存目录
     *  * @param remoteFileName:保存文件名
     *  * @param localPath:本地上传目录(以路径符号结束)
     *  * @param localFileName:上传的文件名
     *  * @return
     *  
     */
    public boolean uploadFile(String remotePath, String remoteFileName, String localFile)
    {
        FileInputStream in = null;
        try
        {
            cdDir(remotePath);
            in = new FileInputStream(localFile);
            sftp.put(in, remoteFileName);

            if (log.isInfoEnabled())
            {
                log.info(" file.upload: [{}] success.", localFile.substring(localFile.lastIndexOf(File.separator)));
            }

            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 delLocal:上传后是否删除本地文件
     *  * @return
     *  
     */
    public List<String> uploadFiles(String remotePath, String localPath, String prefix, String suffix, boolean delLocal)
    {
        List<String> upfiles = new ArrayList<String>();
        try
        {
            File file = new File(localPath);
            File[] files = file.listFiles();

            prefix = prefix == null ? "" : prefix.trim();
            suffix = suffix == null ? "" : suffix.trim();

            for (int i = 0; i < files.length; i++)
            {
                String fileName = files[i].getName();
                if ((prefix.equals("") || fileName.startsWith(prefix)) && (suffix.equals("") || fileName.endsWith(suffix)))
                {
                    if (files[i].isFile())
                    {
                        boolean isUpload = this.uploadFile(remotePath, fileName, files[i].getAbsolutePath());
                        if (isUpload)
                        {
                            upfiles.add(files[i].getAbsolutePath());
                            if (delLocal)
                                deleteLocal(files[i]);
                        }
                    }
                }
            }

            if (log.isInfoEnabled())
            {
                log.info(" file upload success,file size : {}", upfiles.size());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            this.disconnect();
        }

        return upfiles;

    }

    /**
     *  * 删除本地文件
     *  * @param filePath
     *  * @return
     *  
     */
    public boolean deleteLocal(File file)
    {
        if (!file.exists())
        {
            return false;
        }

        if (!file.isFile())
        {
            return false;
        }

        boolean rs = file.delete();
        if (rs && log.isInfoEnabled())
        {
            log.info(" file.delete.success.");
        }
        return rs;
    }

    /**
     *  * 创建目录
     *  * @param createpath
     *  * @return
     *  
     */
    public boolean cdDir(String createpath)
    {
        try
        {

            String pwd = this.sftp.pwd();
            if (pwd.contains("/" + createpath + "/"))
                return true;

            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());
                }

            }

            pwd = this.sftp.pwd();
            if (pwd.contains("/" + 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 (SftpException e)
        {
            if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE)
            //if (e.getMessage().toLowerCase().equals("no such file"))
            {
                isDirExistFlag = false;
            }
        }
        return isDirExistFlag;
    }

    /**
     *  * 删除stfp文件
     *  * @param directory:要删除文件所在目录
     *  * @param deleteLocal:要删除的文件
     *  * @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:\\dev\\java\\workspace\\testobj\\outfiles\\";
        //
        //        // Sftp下载路径
        //        String sftpPath = "/home/web/static/js/";
        //        List<String> filePathList = new ArrayList<String>();
        //        try
        //        {
        //            sftp = new SftpUtils("127.0.0.1", 22, "root", "xxxx");
        //            sftp.connect();
        //            // 下载
        //            // sftp.downloadFiles(sftpPath, localPath, "", ".js", false);
        //
        //            sftp.uploadFiles(sftpPath, localPath, "", "rar", true);
        //
        //        }
        //        catch (Exception e)
        //        {
        //            e.printStackTrace();
        //        }
        //        finally
        //        {
        //            sftp.disconnect();
        //        }
    }
}

原文地址:https://www.cnblogs.com/lovellll/p/10213919.html

时间: 2024-11-08 14:18:53

JAVA Sftp 上传下载的相关文章

Java Sftp上传下载文件

需要使用jar包  jsch-0.1.50.jar sftp上传下载实现类 package com.bstek.transit.sftp; 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 co

SFTP上传下载文件

secureCRT SFTP上传/下载文件 远程登陆IP secureCRT会话中点击SFTP 3.cd  /home/dowload       linux平台切换到/home/dowload目录 4.cd d:\   windows平台切换到d盘 5.put 文件名           上传 /home/dowload目录下 6.get 文件名   下载文件到windows平台 d盘

SFTP上传下载文件、文件夹常用操作

SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd  d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文件取出来)进入你要下的文件所在的文件夹:cd /usr/apache-tomcat-6.0.39/logs/下载:get catalina.out 5.上传文件(例如我要上传一个文件到usr目录下)进入你想要上传文件的目录cd /usr上传文件put do.sh 6.上传下载文件夹格式:下载文件夹g

java实现上传下载积分方法

原文:java实现上传下载积分方法 代码下载:http://www.zuidaima.com/share/1550463242472448.htm 类似牛币的加减分数的方法,上传加分,下载减分,下载一样的不加不减. java实现上传下载积分方法

28、java文件上传下载、邮件收发

文件上传下载 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:multipart/form-data FileUpload 文件上传功能开发中比较常用,apache也提供了文件上传组件! FileUpload组件: 1. 下载源码 2. 项目中引入jar文件

java ftp 上传下载工具类

1 package com.mohecun.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.OutputStre

Xshell5下利用sftp上传下载传输文件

sftp是Secure File TransferProtocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp与 ftp有着几乎一样的语法和功能.SFTP为 SSH的一部分,是一种传输档案至Blogger伺服器的安全方式.其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来

java ftp上传下载

/** * Description: 从FTP服务器下载文件 * @param url FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param remotePath FTP服务器上的相对路径 * @param fileName 要下载的文件名 * @param localPath 下载后保存到本地的路径 * @return */ public static

用jsch.jar实现SFTP上传下载删除

java类: 需要引用的jar: jsch-0.1.53.jar package com.isoftstone.www.ftp; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; import java.util.Vector; import com.jcraft.jsch.Channel; import com.jc