基于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();
}
} |
相关推荐
JSch - Java实现的SFTP(文件上传详解篇)
jsch实现sftp文件上传、下载文件,提供jsch jar
本篇文章主要介绍了JAVA SFTP文件上传、下载及批量下载实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
jsch.jar java使用sftp实现上传下载文件 ,包含jar包 及 实现的工具类 ,供各位参考
jsch-0.1.53 不支持修改编码格式,sftp.setFilenameEncoding("GBK");这样修改是不起作用的,所以必须修改源码。此处是修改源码后重新导出的jar包。
java实现sftp上传下载文件,使用jcraft实现,含所需jar包。
java 实现 sftp 文件上传下载 等操作。
JSch - Java实现的SFTP(文件上传/下载详解篇)
利用com.jcraft.jsch进行SFTP下载文件,方便简单快捷操作SFTP
主要介绍了详解Java使用Jsch与sftp服务器实现ssh免密登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java通过sftp模式实现FTP的文件上传下载删除功能
主要为大家详细介绍了java使用JSCH实现SFTP文件管理,实现上传、下载等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java实现后端数据导出成csv文件并上传到指定的sftp服务器,主要是使用univocity-parsers来做的csv文件导出以及采用jsch来完成csv文件的sftp上传。
java编码,通过ftp和sftp连接linux服务器上次和下载文件。
sftp解决上传中文乱码,sftp.setFilenameEncoding("GBK");修改是不起作用的,修改源码后重新导出的jar包。
用jsch实现ftp上传整个文件夹,用jsch实现ftp上传整个文件夹,用jsch实现ftp上传整个文件夹,
Java 操作SFTP上传文件下载案例,很值得看的,Java 操作SFTP上传文件下载案例,很值得看的。
jsch-jar包文件
浏览博客时看到的关于JSCH工具实现文件下载的功能,讲解很详细,文档中也包含了原文章的路径。