首页 > 编程语言 >Java连接服务器的两种方式SFTP和FTP

Java连接服务器的两种方式SFTP和FTP

时间:2023-11-07 23:33:41浏览次数:33  
标签:FTP Java String param SFTP channel logger ftpClient

https://www.jb51.net/article/276407.htm

在项目开发中,一般文件存储很少再使用SFTP服务,但是也不排除合作伙伴使用SFTP来存储项目中的文件或者通过SFTP来实现文件数据的交互,这篇文章主要介绍了Java集成FTP与SFTP连接池

目录

  • 区别
  • FtpUtil
  • SFTPUtil
  • 问题


区别

FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资源。FTP客户端通过FTP协议在服务器上下载资源。而一般要使用FTP需要在服务器上安装FTP服务。

而SFTP协议是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全,但是传输的效率比FTP要低,传输速度更慢(不过现实使用当中,没有发现多大差别)。SFTP和SSH使用的是相同的22端口,因此免安装直接可以使用。

总结:

一;FTP要安装,SFTP不要安装。

二;SFTP更安全,但更安全带来副作用就是的效率比FTP要低。


FtpUtil

1

2

3

4

5

6


<

dependency

>


<

groupId

>commons-net

groupId

>


<

artifactId

>commons-net

artifactId

>


<

version

>3.6

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

import

org.apache.commons.net.ftp.FTP;

import

org.apache.commons.net.ftp.FTPClient;

import

org.apache.commons.net.ftp.FTPFile;

import

org.apache.commons.net.ftp.FTPReply;

import

org.slf4j.Logger;

import

org.slf4j.LoggerFactory;

import

org.springframework.beans.factory.annotation.Value;

import

org.springframework.stereotype.Component;

import

java.io.*;

@Component

public

class

FtpUtil {


private

static

final

Logger logger = LoggerFactory.getLogger(FtpUtil.

class

);


//ftp服务器地址


@Value

(

"${ftp.server}"

)


private

String hostname;


//ftp服务器端口


@Value

(

"${ftp.port}"

)


private

int

port;


//ftp登录账号


@Value

(

"${ftp.userName}"

)


private

String username;


//ftp登录密码


@Value

(

"${ftp.userPassword}"

)


private

String password;


/**


* 初始化FTP服务器


*


* @return


*/


public

FTPClient getFtpClient() {


FTPClient ftpClient =

new

FTPClient();


ftpClient.setControlEncoding(

"UTF-8"

);


try

{


//设置连接超时时间


ftpClient.setDataTimeout(

1000

*

120

);


logger.info(

"连接FTP服务器中:"

+ hostname +

":"

+ port);


//连接ftp服务器


ftpClient.connect(hostname, port);


//登录ftp服务器


ftpClient.login(username, password);


// 是否成功登录服务器


int

replyCode = ftpClient.getReplyCode();


if

(FTPReply.isPositiveCompletion(replyCode)) {


logger.info(

"连接FTP服务器成功:"

+ hostname +

":"

+ port);


}

else

{


logger.error(

"连接FTP服务器失败:"

+ hostname +

":"

+ port);


closeFtpClient(ftpClient);


}


}

catch

(IOException e) {


logger.error(

"连接ftp服务器异常"

, e);


}


return

ftpClient;


}


/**


* 上传文件


*


* @param pathName    路径


* @param fileName    文件名


* @param inputStream 输入文件流


* @return


*/


public

boolean

uploadFileToFtp(String pathName, String fileName, InputStream inputStream) {


boolean

isSuccess =

false

;


FTPClient ftpClient = getFtpClient();


try

{


if

(ftpClient.isConnected()) {


logger.info(

"开始上传文件到FTP,文件名称:"

+ fileName);


//设置上传文件类型为二进制,否则将无法打开文件


ftpClient.setFileType(FTP.BINARY_FILE_TYPE);


//路径切换,如果目录不存在创建目录


if

(!ftpClient.changeWorkingDirectory(pathName)) {


boolean

flag =

this

.changeAndMakeWorkingDir(ftpClient, pathName);


if

(!flag) {


logger.error(

"路径切换(创建目录)失败"

);


return

false

;


}


}


//设置被动模式,文件传输端口设置(如上传文件夹成功,不能上传文件,注释这行,否则报错refused:connect)


ftpClient.enterLocalPassiveMode();


ftpClient.storeFile(fileName, inputStream);


inputStream.close();


ftpClient.logout();


isSuccess =

true

;


logger.info(fileName +

"文件上传到FTP成功"

);


}

else

{


logger.error(

"FTP连接建立失败"

);


}


}

catch

(Exception e) {


logger.error(fileName +

"文件上传异常"

, e);



}

finally

{


closeFtpClient(ftpClient);


closeStream(inputStream);


}


return

isSuccess;


}


/**


* 删除文件


*


* @param pathName 路径


* @param fileName 文件名


* @return


*/


public

boolean

deleteFile(String pathName, String fileName) {


boolean

flag =

false

;


FTPClient ftpClient = getFtpClient();


try

{


logger.info(

"开始删除文件"

);


if

(ftpClient.isConnected()) {


//路径切换


ftpClient.changeWorkingDirectory(pathName);


ftpClient.enterLocalPassiveMode();


ftpClient.dele(fileName);


ftpClient.logout();


flag =

true

;


logger.info(

"删除文件成功"

);


}

else

{


logger.info(

"删除文件失败"

);


}


}

catch

(Exception e) {


logger.error(fileName +

"文件删除异常"

, e);


}

finally

{


closeFtpClient(ftpClient);


}


return

flag;


}


/**


* 关闭FTP连接


*


* @param ftpClient


*/


public

void

closeFtpClient(FTPClient ftpClient) {


if

(ftpClient.isConnected()) {


try

{


ftpClient.disconnect();


}

catch

(IOException e) {


logger.error(

"关闭FTP连接异常"

, e);


}


}


}


/**


* 关闭文件流


*


* @param closeable


*/


public

void

closeStream(Closeable closeable) {


if

(

null

!= closeable) {


try

{


closeable.close();


}

catch

(IOException e) {


logger.error(

"关闭文件流异常"

, e);


}


}


}


/**


* 路径切换(没有则创建)


*


* @param ftpClient FTP服务器


* @param path      路径


*/


public

void

changeAndMakeWorkingDir(FTPClient ftpClient, String path) {


boolean

flag =

false

;


try

{


String[] path_array = path.split(

"/"

);


for

(String s : path_array) {


boolean

b = ftpClient.changeWorkingDirectory(s);


if

(!b) {


ftpClient.makeDirectory(s);


ftpClient.changeWorkingDirectory(s);


}


}


flag =

true

;


}

catch

(IOException e) {


logger.error(

"路径切换异常"

, e);


}


return

flag;


}


/**


* 从FTP下载到本地文件夹


*


* @param ftpClient      FTP服务器


* @param pathName       路径


* @param targetFileName 文件名


* @param localPath      本地路径


* @return


*/


public

boolean

downloadFile(FTPClient ftpClient, String pathName, String targetFileName, String localPath) {


boolean

flag =

false

;


OutputStream os =

null

;


try

{


System.out.println(

"开始下载文件"

);


//切换FTP目录


ftpClient.changeWorkingDirectory(pathName);


ftpClient.enterLocalPassiveMode();


FTPFile[] ftpFiles = ftpClient.listFiles();


for

(FTPFile file : ftpFiles) {


String ftpFileName = file.getName();


if

(targetFileName.equalsIgnoreCase(ftpFileName)) {


File localFile =

new

File(localPath + targetFileName);


os =

new

FileOutputStream(localFile);


ftpClient.retrieveFile(file.getName(), os);


os.close();


}


}


ftpClient.logout();


flag =

true

;


logger.info(

"下载文件成功"

);


}

catch

(Exception e) {


logger.error(

"下载文件失败"

, e);


}

finally

{


closeFtpClient(ftpClient);


closeStream(os);


}


return

flag;


}

}


SFTPUtil

1

2

3

4

5

<

dependency

>


<

groupId

>com.jcraft

groupId

>


<

artifactId

>jsch

artifactId

>


<

version

>0.1.54

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

import

com.jcraft.jsch.*;

import

org.slf4j.Logger;

import

org.slf4j.LoggerFactory;

import

org.springframework.stereotype.Component;

import

java.io.File;

import

java.io.FileNotFoundException;

import

java.io.FileOutputStream;

import

java.io.InputStream;

import

java.util.Properties;

import

java.util.Vector;

@Component

public

class

SFTPUtil {


private

static

final

Logger logger = LoggerFactory.getLogger(SFTPUtil.

class

);


private

Session session =

null

;


private

ChannelSftp channel =

null

;


private

int

timeout =

60000

;


/**


* 连接sftp服务器


*/


public

boolean

connect(String ftpUsername, String ftpAddress,

int

ftpPort, String ftpPassword) {


boolean

isSuccess =

false

;


if

(channel !=

null

) {


System.out.println(

"通道不为空"

);


return

false

;


}


//创建JSch对象


JSch jSch =

new

JSch();


try

{


// 根据用户名,主机ip和端口获取一个Session对象


session = jSch.getSession(ftpUsername, ftpAddress, ftpPort);


//设置密码


session.setPassword(ftpPassword);


Properties config =

new

Properties();


config.put(

"StrictHostKeyChecking"

,

"no"

);


//为Session对象设置properties


session.setConfig(config);


//设置超时


session.setTimeout(timeout);


//通过Session建立连接


session.connect();


System.out.println(

"Session连接成功"

);


// 打开SFTP通道


channel = (ChannelSftp) session.openChannel(

"sftp"

);


// 建立SFTP通道的连接


channel.connect();


System.out.println(

"通道连接成功"

);


isSuccess =

true

;


}

catch

(JSchException e) {


logger.error(

"连接服务器异常"

, e);


}


return

isSuccess;


}


/**


* 关闭连接


*/


public

void

close() {


//操作完毕后,关闭通道并退出本次会话


if

(channel !=

null

&& channel.isConnected()) {


channel.disconnect();


}


if

(session !=

null

&& session.isConnected()) {


session.disconnect();


}


}


/**


* 文件上传


* 采用默认的传输模式:OVERWRITE


* @param src      输入流


* @param dst      上传路径


* @param fileName 上传文件名


*


* @throws SftpException


*/


public

boolean

upLoadFile(InputStream src, String dst, String fileName)

throws

SftpException {


boolean

isSuccess =

false

;


try

{


if

(createDir(dst)) {


channel.put(src, fileName);


isSuccess =

true

;


}


}

catch

(SftpException e) {


logger.error(fileName +

"文件上传异常"

, e);


}


return

isSuccess;


}


/**


* 创建一个文件目录


*


* @param createpath  路径


* @return


*/


public

boolean

createDir(String createpath) {


boolean

isSuccess =

false

;


try

{


if

(isDirExist(createpath)) {


channel.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())) {


channel.cd(filePath.toString());


}

else

{


// 建立目录


channel.mkdir(filePath.toString());


// 进入并设置为当前目录


channel.cd(filePath.toString());


}


}


channel.cd(createpath);


isSuccess =

true

;


}

catch

(SftpException e) {


logger.error(

"目录创建异常!"

, e);


}


return

isSuccess;


}


/**


* 判断目录是否存在


* @param directory     路径


* @return


*/


public

boolean

isDirExist(String directory) {


boolean

isSuccess =

false

;


try

{


SftpATTRS sftpATTRS = channel.lstat(directory);


isSuccess =

true

;


return

sftpATTRS.isDir();


}

catch

(Exception e) {


if

(e.getMessage().toLowerCase().equals(

"no such file"

)) {


isSuccess =

false

;


}


}


return

isSuccess;


}


/**


* 重命名指定文件或目录


*


*/


public

boolean

rename(String oldPath, String newPath) {


boolean

isSuccess =

false

;


try

{


channel.rename(oldPath, newPath);


isSuccess =

true

;


}

catch

(SftpException e) {


logger.error(

"重命名指定文件或目录异常"

, e);


}


return

isSuccess;


}


/**


* 列出指定目录下的所有文件和子目录。


*/


public

Vector ls(String path) {


try

{


Vector vector = channel.ls(path);


return

vector;


}

catch

(SftpException e) {


logger.error(

"列出指定目录下的所有文件和子目录。"

, e);


}


return

null

;


}


/**


* 删除文件


*


* @param directory  linux服务器文件地址


* @param deleteFile 文件名称


*/


public

boolean

deleteFile(String directory, String deleteFile) {


boolean

isSuccess =

false

;


try

{


channel.cd(directory);


channel.rm(deleteFile);


isSuccess =

true

;


}

catch

(SftpException e) {


logger.error(

"删除文件失败"

, e);


}


return

isSuccess;


}


/**


* 下载文件


*


* @param directory    下载目录


* @param downloadFile 下载的文件


* @param saveFile     下载到本地路径


*/


public

boolean

download(String directory, String downloadFile, String saveFile) {


boolean

isSuccess =

false

;


try

{


channel.cd(directory);


File file =

new

File(saveFile);


channel.get(downloadFile,

new

FileOutputStream(file));


isSuccess =

true

;


}

catch

(SftpException e) {


logger.error(

"下载文件失败"

, e);


}

catch

(FileNotFoundException e) {


logger.error(

"下载文件失败"

, e);


}


return

isSuccess;


}

}


问题

文件超出默认大小

#单文件上传最大大小,默认1Mbspring.http.multipart.maxFileSize=100Mb#多文件上传时最大大小,默认10Mbspring.http.multipart.maxRequestSize=500MB

标签:FTP,Java,String,param,SFTP,channel,logger,ftpClient
From: https://blog.51cto.com/u_16270801/8240583

相关文章

  • JAVA开发(JAVA架构师成长之路)
    从一个最基础的JAVA开发人员成为JAVA架构师,需要经历8层能力的进阶。第一阶段:熟悉JAVA基础语法,学会写各种ifelse和流程语句,熟练使用各种数据类型,集合。能依葫芦画瓢,模仿别人的代码结构,新增类,修改类的信息和逻辑。这个阶段大概是一年的经验。第二阶段:熟悉使用各种开源组件,比如知......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • Java 注释
    单行注释://多行注释:/**/文档注释:/**回车设置单行注释多行注释文档注释的颜色:File→Settings→ColorScheme→Java→Cmomentslinecomment单行注释blockcomment注释区块(多行注释) JavaDoc文档注释 ......
  • Java异常处理
    三.Java异常处理(1)什么是异常?异常就是代表程序出现的问题。Java会将异常封装成一个异常对象,抛给JVM虚拟机,JVM虚拟机会将程序暂停再将异常对象打印出来。(2)异常的体系所有异常都继承了Throwable类。Error:代表的系统级别错误(属于严重问题),一般开发人员用不到,属于是sun公司自己用......
  • JavaScript--变量和数据类型
    使用var声明变量vartest=20;test="张三";变量可以存放不同类型的值var定义域分布在全局并且可以重复定义letlet关键字所在的代码块内有效JavaScript中分为:原始类型和引用类型5种原始类型number:数字,整数或者小数string:字符、字符串boolean:布尔null:空undefined:......
  • 【JavaScript】事件轮询
    1、先参考搞懂JavsScript异步— 事件轮询2、明确几点:setTimeout、DOMEvent、HttpRequest、setInterval、setImmediate(Node.js独有)的回调、I/O操作、UI渲染均会被加载到消息队列(macrotask宏任务)。Promise的回调、MutationObserver、process.nextTick(Node.js独有)会被加......
  • Java的流
    一、数据流概念1.输入输出的概念​输入输出技术用于处理设备之间的数据传输,指的是程序和外部设备或者其他计算机进行数据交换的过程,比如读/写文件、网络通信等。将外部数据读取到内存中称为输入,将内存数据输出到磁盘、光盘中称为输出。2.流的概念Java程序中,对于......
  • Java面向对象(三)
    方法的重写方法的重写与之前所学中方法的重载好像名字的相似,但是两者之间可以说毫不相干。方法的重写是当父类中的方法已经没办法满足子类的需求时。子类就需要将方法进行重写。方法重写的要求父类的方法并不是所有的方法都可以被重写,重写也是需要遵守一定的规则:①重写的方法......
  • java代码中拼接的长字符有么又快速去掉+好的方法?
    在Java中,拼接长字符时使用+运算符会导致性能下降,因为每次拼接都会创建一个新的字符串对象。为了提高性能,可以使用StringBuilder或StringBuffer类来代替+运算符。这两个类都提供了操作字符串的方法,并且在拼接长字符时效率更高,因为它们是可变的。示例代码如下:StringBuilder......
  • 安卓程序和java程序的区别,举个详细的例子
    安卓程序(AndroidApp)和普通的Java程序都使用Java语言编写,但它们的开发、运行环境和目标平台有很大的不同。以下是一些关键的区别:开发环境和工具:安卓程序:使用AndroidStudio作为主要的开发环境,它提供了专门为Android开发设计的工具和插件。这些工具包括模拟器、界面设计工具、性......