`
shuai1234
  • 浏览: 933013 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

java通过sftp JSch 上传文件下载文件查看文件目录,测试可用

    博客分类:
  • java
 
阅读更多

 

基于maven构建工程,pom.xml加入依赖。

<dependency>  
      <groupId>com.jcraft</groupId>  
      <artifactId>jsch</artifactId>  
      <version>0.1.53</version>  
</dependency>  

第二步 工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
package com.guohuai.util;   
     
import java.io.ByteArrayInputStream;   
import java.io.File;   
import java.io.FileInputStream;   
import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.InputStream;   
import java.io.UnsupportedEncodingException;   
import java.util.Properties;   
import java.util.Vector; 
import org.apache.commons.io.IOUtils;   
import org.slf4j.Logger;   
import org.slf4j.LoggerFactory; 
import com.jcraft.jsch.Channel;   
import com.jcraft.jsch.ChannelSftp;   
import com.jcraft.jsch.JSch;   
import com.jcraft.jsch.JSchException;   
import com.jcraft.jsch.Session;   
import com.jcraft.jsch.SftpException; 
   
/** 
 *  
 * @ClassName: SFTPUtil 
 * @Description: sftp连接工具类 
 * @date 2017年5月22日 下午11:17:21 
 * @version 1.0.0 
 */   
public class SFTPUtil {   
    private transient Logger log = LoggerFactory.getLogger(this.getClass());   
         
    private ChannelSftp sftp;   
           
    private Session session;   
    /** FTP 登录用户名*/     
    private String username;   
    /** FTP 登录密码*/     
    private String password;   
    /** 私钥 */     
    private String privateKey;   
    /** FTP 服务器地址IP地址*/     
    private String host;   
    /** FTP 端口*/   
    private int port;   
           
    /**  
     * 构造基于密码认证的sftp对象  
     * @param userName  
     * @param password  
     * @param host  
     * @param port  
     */     
    public SFTPUtil(String username, String password, String host, int port) {   
        this.username = username;   
        this.password = password;   
        this.host = host;   
        this.port = port;   
    }   
       
    /**  
     * 构造基于秘钥认证的sftp对象 
     * @param userName 
     * @param host 
     * @param port 
     * @param privateKey 
     */   
    public SFTPUtil(String username, String host, int port, String privateKey) {   
        this.username = username;   
        this.host = host;   
        this.port = port;   
        this.privateKey = privateKey;   
    }   
       
    public SFTPUtil(){}   
       
    /** 
     * 连接sftp服务器
     * @throws Exception  
     */   
    public void login(){   
        try {   
            JSch jsch = new JSch();   
            if (privateKey != null) {   
                jsch.addIdentity(privateKey);// 设置私钥   
                log.info("sftp connect,path of private key file:{}" , privateKey);   
            }   
            log.info("sftp connect by host:{} username:{}",host,username);   
       
            session = jsch.getSession(username, host, port);   
            log.info("Session is build");   
            if (password != null) {   
                session.setPassword(password);     
            }   
            Properties config = new Properties();   
            config.put("StrictHostKeyChecking""no");   
            config.put("kex", "diffie-hellman-group1-sha1");// 同时需要修改openSSH配置文件       
            session.setConfig(config);   
            session.connect();   
            log.info("Session is connected");   
                 
            Channel channel = session.openChannel("sftp");   
            channel.connect();   
            log.info("channel is connected");   
       
            sftp = (ChannelSftp) channel;   
            log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));   
        catch (JSchException e) {   
            log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}"new Object[]{host, port, e.getMessage()});     
        }   
    }     
       
    /** 
     * 关闭连接 server  
     */   
    public void logout(){   
        if (sftp != null) {   
            if (sftp.isConnected()) {   
                sftp.disconnect();   
                log.info("sftp is closed already");   
            }   
        }   
        if (session != null) {   
            if (session.isConnected()) {   
                session.disconnect();   
                log.info("sshSession is closed already");   
            }   
        }   
    }   
       
    /**  
     * 将输入流的数据上传到sftp作为文件
     * @param directory 上传到该目录  
     * @param sftpFileName sftp端文件名  
     * @param in 输入流  
     * @throws SftpException   
     * @throws Exception  
     */     
    public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{   
        try {     
            sftp.cd(directory);   
        catch (SftpException e) {   
            log.warn("directory is not exist");   
            sftp.mkdir(directory);   
            sftp.cd(directory);   
        }   
        sftp.put(input, sftpFileName);   
        log.info("file:{} is upload successful" , sftpFileName);   
    }   
       
    /**  
     * 上传单个文件
     * @param directory 上传到sftp目录  
     * @param uploadFile 要上传的文件,包括路径  
     * @throws FileNotFoundException 
     * @throws SftpException 
     * @throws Exception 
     */   
    public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{   
        File file = new File(uploadFile);   
        upload(directory, file.getName(), new FileInputStream(file));   
    }   
       
    /** 
     * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。
     * @param directory 上传到sftp目录 
     * @param sftpFileName 文件在sftp端的命名 
     * @param byteArr 要上传的字节数组 
     * @throws SftpException 
     * @throws Exception 
     */   
    public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{   
        upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));   
    }   
       
    /**  
     * 将字符串按照指定的字符编码上传到sftp
     * @param directory 上传到sftp目录 
     * @param sftpFileName 文件在sftp端的命名 
     * @param dataStr 待上传的数据 
     * @param charsetName sftp上的文件,按该字符编码保存 
     * @throws UnsupportedEncodingException 
     * @throws SftpException 
     * @throws Exception 
     */   
    public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{     
        upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));     
    }   
       
    /** 
     * 下载文件  
     * @param directory 下载目录  
     * @param downloadFile 下载的文件 
     * @param saveFile 存在本地的路径 
     * @throws SftpException 
     * @throws FileNotFoundException 
     * @throws Exception 
     */     
    public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{   
        if (directory != null && !"".equals(directory)) {   
            sftp.cd(directory);   
        }   
        File file = new File(saveFile);   
        sftp.get(downloadFile, new FileOutputStream(file));   
        log.info("file:{} is download successful" , downloadFile);   
    }  
       
    /**  
     * 下载文件 
     * @param directory 下载目录 
     * @param downloadFile 下载的文件名 
     * @return 字节数组 
     * @throws SftpException 
     * @throws IOException 
     * @throws Exception 
     */   
    public byte[] download(String directory, String downloadFile) throws SftpException, IOException{   
        if (directory != null && !"".equals(directory)) {   
            sftp.cd(directory);   
        }   
        InputStream is = sftp.get(downloadFile); 
        byte[] fileData = IOUtils.toByteArray(is); 
        log.info("file:{} is download successful" , downloadFile);   
        return fileData;   
    }   
       
    /** 
     * 删除文件 
     * @param directory 要删除文件所在目录 
     * @param deleteFile 要删除的文件 
     * @throws SftpException 
     * @throws Exception 
     */   
    public void delete(String directory, String deleteFile) throws SftpException{   
        sftp.cd(directory);   
        sftp.rm(deleteFile);   
    }   
       
    /** 
     * 列出目录下的文件
     * @param directory 要列出的目录 
     * @param sftp 
     * @return 
     * @throws SftpException 
     */   
    public Vector<?> listFiles(String directory) throws SftpException {   
        return sftp.ls(directory);   
    }   
         
    public static void main(String[] args) throws SftpException, IOException {   
        SFTPUtil sftp = new SFTPUtil("lanhuigu""123456""192.168.200.12"22);   
        sftp.login();   
        //byte[] buff = sftp.download("/opt", "start.sh");   
        //System.out.println(Arrays.toString(buff));   
        File file = new File("D:\\upload\\index.html");   
        InputStream is = new FileInputStream(file);   
             
        sftp.upload("/data/work""test_sftp_upload.csv", is);   
        sftp.logout();   
    }   
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics