使用SFTP上传文件到服务器的简单使用

最近用到SFTP上传文件查找了一些资料后自己做了一点总结,方便以后的查询

    /**
     * 将文件上传到服务器
     * 
     * @param filePath
     *            文件路径
     * @param channelSftp
     *            channelSftp对象
     * @return
     */
    public static boolean uploadFile(String filePath, ChannelSftp channelSftp) {
        OutputStream outstream = null;
        InputStream instream = null;
        boolean successFlag = false;
        try {
            File isfile = new File(filePath);

            if (isfile.isFile()) {
                outstream = channelSftp.put(isfile.getName());
                File file = new File(filePath);
                if (file.exists()) {
                    instream = new FileInputStream(file);
                    byte b[] = new byte[1024];
                    int n;
                    while ((n = instream.read(b)) != -1) {
                        outstream.write(b, 0, n);
                    }
                    outstream.flush();
                }
                successFlag = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (instream != null) {
                    instream.close();
                }
                if (outstream != null) {
                    outstream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return successFlag;
    }

    private static Session initJschSession()
            throws JSchException {

        int ftpPort = 0;
        String ftpHost = "";
        String port = "00";   //sftp的端口号
        String ftpUserName = "";  //用户名
        String ftpPassword = "";  //链接的密码
        String privateKey = "";   //
        String passphrase = "";
        if (port != null && !port.equals("")) {
            ftpPort = Integer.valueOf(port);
        }
        JSch jsch = new JSch(); // 创建JSch对象
        if (StringUtils.isNotBlank(privateKey)
                && StringUtils.isNotBlank(passphrase)) {
            jsch.addIdentity(privateKey, passphrase);
        }

        if (StringUtils.isNotBlank(privateKey)
                && StringUtils.isBlank(passphrase)) {
            jsch.addIdentity(privateKey);
        }
        jsch.getSession(ftpUserName, ftpHost, ftpPort);
        Session session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名,主机ip,端口获取一个Session对象
        if (StringUtils.isNotBlank(ftpPassword)) {
            session.setPassword(ftpPassword); // 设置密码
        }
        return session;

    }

    /**
     * 获取ChannelSftp链接
     * 
     * @param timeout
     *            超时时间
     * @return 返回ChannelSftp对象
     * @throws JSchException
     */
    public static ChannelSftp getChannelSftp(Session session, int timeout)
            throws JSchException {

        Channel channel = null;
        
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config); // 为Session对象设置properties
        session.setTimeout(timeout); // 设置timeout时间
        session.connect(); // 通过Session建立链接

        channel = session.openChannel("sftp"); // 打开SFTP通道
        channel.connect(); // 建立SFTP通道的连接
        return (ChannelSftp) channel;  
    }

    /**
     * 断开sftp链接
     * 
     * @param session
     *            会话
     * @param channel
     *            通道
     */
    public static void closeConnection(Channel channel, Session session) {
        try {
            if (session != null) {
                session.disconnect(); //关闭session链接
            }
            if (channel != null) {
                channel.disconnect();  //断开连接
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这里的用户名密码都是自己设置,这里的方法进行了简单的封装,方便使用

posted @ 2013-09-25 18:22  唐凯  阅读(4434)  评论(0编辑  收藏  举报