好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java使用Sftp和Ftp实现对文件的上传和下载

sftp和ftp两种方式区别,还不清楚的,请自行百度查询,此处不多赘述。完整代码地址在结尾!!

第一步,导入maven依赖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<!-- FTP依赖包 -->

< dependency >

   < groupId >commons-net</ groupId >

   < artifactId >commons-net</ artifactId >

   < version >3.6</ version >

</ dependency >

<!-- SFTP依赖包 -->

< dependency >

   < groupId >com.jcraft</ groupId >

   < artifactId >jsch</ artifactId >

   < version >0.1.55</ version >

</ dependency >

< dependency >

   < groupId >commons-io</ groupId >

   < artifactId >commons-io</ artifactId >

   < version >2.6</ version >

</ dependency >

第二步,创建并编写SftpUtils类,运行main方法查看效果,如下

?

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

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

import com.jcraft.jsch.*;

import lombok.extern.slf4j.Slf4j;

import org.apache测试数据mons.io.IOUtils;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.util.Properties;

import java.util.Vector;

 

/**

  * @Description: sftp上传下载工具类

  * @Author: jinhaoxun

  * @Date: 2020/1/16 16:13

  * @Version: 1.0.0

  */

@Slf4j

public class SftpUtils {

 

   public static void main(String[] args) throws Exception {

     log.info( "测试开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );

     // 1

     File file = new File( "E:\\2.xlsx" );

     InputStream inputStream = new FileInputStream(file);

     SftpUtils.uploadFile( "" , "" , "" , 22 , "/usr/local" ,

         "/testfile/" , "test.xlsx" , null , inputStream);

 

     // 2

     SftpUtils.downloadFile( "" , "" , "" , 22 , null ,

         "/usr/local/testfile/" , "test.csv" , "/Users/ao/Desktop/test.csv" );

 

     // 3

     SftpUtils.deleteFile( "" , "" , "" , 22 , null ,

         "/usr/local/testfile/" , "test.xlsx" );

 

     // 4

     Vector<?> fileList = SftpUtils.getFileList( "" , "" , "" ,

         22 , null , "/usr/local/testfile/" );

     log.info(fileList.toString());

     log.info( "测试结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );

   }

 

   /**

    * @Author: jinhaoxun

    * @Description: 下载文件

    * @param userName 用户名

    * @param password 密码

    * @param host ip

    * @param port 端口

    * @param basePath 根路径

    * @param filePath 文件路径(加上根路径)

    * @param filename 文件名

    * @param privateKey 秘钥

    * @param input 文件流

    * @Date: 2020/1/16 21:23

    * @Return: void

    * @Throws: Exception

    */

   public static void uploadFile(String userName, String password, String host, int port, String basePath,

                    String filePath, String filename, String privateKey, InputStream input) throws Exception {

 

     Session session = null ;

     ChannelSftp sftp = null ;

     // 连接sftp服务器

     try {

       JSch jsch = new JSch();

       if (privateKey != null ) {

         // 设置私钥

         jsch.addIdentity(privateKey);

       }

 

       session = jsch.getSession(userName, host, port);

 

       if (password != null ) {

         session.setPassword(password);

       }

       Properties config = new Properties();

       config.put( "StrictHostKeyChecking" , "no" );

 

       session.setConfig(config);

       session.connect();

 

       Channel channel = session.openChannel( "sftp" );

       channel.connect();

 

       sftp = (ChannelSftp) channel;

     } catch (JSchException e) {

       e.printStackTrace();

     }

     // 将输入流的数据上传到sftp作为文件

     try {

       sftp.cd(basePath);

       sftp.cd(filePath);

     } catch (SftpException e) {

       //目录不存在,则创建文件夹

       String [] dirs=filePath.split( "/" );

       String tempPath=basePath;

       for (String dir:dirs){

         if ( null == dir || "" .equals(dir)){

           continue ;

         }

         tempPath+= "/" +dir;

         try {

           sftp.cd(tempPath);

         } catch (SftpException ex){

           sftp.mkdir(tempPath);

           sftp.cd(tempPath);

         }

       }

     }

     //上传文件

     sftp.put(input, filename);

     //关闭连接 server

     if (sftp != null ) {

       if (sftp.isConnected()) {

         sftp.disconnect();

       }

     }

     //关闭连接 server

     if (session != null ) {

       if (session.isConnected()) {

         session.disconnect();

       }

     }

   }

 

   /**

    * @Author: jinhaoxun

    * @Description: 下载文件

    * @param userName 用户名

    * @param password 密码

    * @param host ip

    * @param port 端口

    * @param privateKey 秘钥

    * @param directory 文件路径

    * @param downloadFile 文件名

    * @param saveFile 存在本地的路径

    * @Date: 2020/1/16 21:22

    * @Return: void

    * @Throws: Exception

    */

   public static void downloadFile(String userName, String password, String host, int port, String privateKey, String directory,

                 String downloadFile, String saveFile) throws Exception{

     Session session = null ;

     ChannelSftp sftp = null ;

     // 连接sftp服务器

     try {

       JSch jsch = new JSch();

       if (privateKey != null ) {

         // 设置私钥

         jsch.addIdentity(privateKey);

       }

 

       session = jsch.getSession(userName, host, port);

 

       if (password != null ) {

         session.setPassword(password);

       }

       Properties config = new Properties();

       config.put( "StrictHostKeyChecking" , "no" );

 

       session.setConfig(config);

       session.connect();

 

       Channel channel = session.openChannel( "sftp" );

       channel.connect();

 

       sftp = (ChannelSftp) channel;

     } catch (JSchException e) {

       e.printStackTrace();

     }

     if (directory != null && ! "" .equals(directory)) {

       sftp.cd(directory);

     }

     File file = new File(saveFile);

     sftp.get(downloadFile, new FileOutputStream(file));

   }

 

   /**

    * @Author: jinhaoxun

    * @Description: 下载文件

    * @param userName 用户名

    * @param password 密码

    * @param host ip

    * @param port 端口

    * @param privateKey 秘钥

    * @param directory 文件路径

    * @param downloadFile 文件名

    * @Date: 2020/1/16 21:21

    * @Return: byte[]

    * @Throws: Exception

    */

   public static byte [] downloadFile(String userName, String password, String host, int port, String privateKey,

                  String directory, String downloadFile) throws Exception{

     Session session = null ;

     ChannelSftp sftp = null ;

     // 连接sftp服务器

     try {

       JSch jsch = new JSch();

       if (privateKey != null ) {

         // 设置私钥

         jsch.addIdentity(privateKey);

       }

 

       session = jsch.getSession(userName, host, port);

 

       if (password != null ) {

         session.setPassword(password);

       }

       Properties config = new Properties();

       config.put( "StrictHostKeyChecking" , "no" );

 

       session.setConfig(config);

       session.connect();

 

       Channel channel = session.openChannel( "sftp" );

       channel.connect();

 

       sftp = (ChannelSftp) channel;

     } catch (JSchException e) {

       e.printStackTrace();

     }

     if (directory != null && ! "" .equals(directory)) {

       sftp.cd(directory);

     }

     InputStream is = sftp.get(downloadFile);

     byte [] fileData = IOUtils.toByteArray(is);

     return fileData;

   }

 

   /**

    * @Author: jinhaoxun

    * @Description: 删除文件

    * @param userName 用户名

    * @param password 密码

    * @param host ip

    * @param port 端口

    * @param privateKey 秘钥

    * @param directory 文件路径

    * @param deleteFile 文件名

    * @Date: 2020/1/16 21:24

    * @Return: void

    * @Throws: Exception

    */

   public static void deleteFile(String userName, String password, String host, int port, String privateKey,

                String directory, String deleteFile) throws Exception{

     Session session = null ;

     ChannelSftp sftp = null ;

     // 连接sftp服务器

     try {

       JSch jsch = new JSch();

       if (privateKey != null ) {

         // 设置私钥

         jsch.addIdentity(privateKey);

       }

 

       session = jsch.getSession(userName, host, port);

 

       if (password != null ) {

         session.setPassword(password);

       }

       Properties config = new Properties();

       config.put( "StrictHostKeyChecking" , "no" );

 

       session.setConfig(config);

       session.connect();

 

       Channel channel = session.openChannel( "sftp" );

       channel.connect();

 

       sftp = (ChannelSftp) channel;

     } catch (JSchException e) {

       e.printStackTrace();

     }

     sftp.cd(directory);

     sftp.rm(deleteFile);

   }

 

   /**

    * @Author: jinhaoxun

    * @Description: 列出目录下的文件

    * @param userName 用户名

    * @param password 密码

    * @param host ip

    * @param port 端口

    * @param privateKey 秘钥

    * @param directory 要列出的目录

    * @Date: 2020/1/16 21:25

    * @Return: java.util.Vector<?>

    * @Throws: Exception

    */

   public static Vector<?> getFileList(String userName, String password, String host, int port, String privateKey,

                    String directory) throws Exception {

     Session session = null ;

     ChannelSftp sftp = null ;

     // 连接sftp服务器

     try {

       JSch jsch = new JSch();

       if (privateKey != null ) {

         // 设置私钥

         jsch.addIdentity(privateKey);

       }

 

       session = jsch.getSession(userName, host, port);

 

       if (password != null ) {

         session.setPassword(password);

       }

       Properties config = new Properties();

       config.put( "StrictHostKeyChecking" , "no" );

 

       session.setConfig(config);

       session.connect();

 

       Channel channel = session.openChannel( "sftp" );

       channel.connect();

 

       sftp = (ChannelSftp) channel;

     } catch (JSchException e) {

       e.printStackTrace();

     }

     return sftp.ls(directory);

   }

 

}

第三步,创建并编写FtpUtils类,运行main方法查看效果,如下

?

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

import lombok.extern.slf4j.Slf4j;

import org.apache测试数据mons.net.ftp.FTP;

import org.apache测试数据mons.net.ftp.FTPClient;

import org.apache测试数据mons.net.ftp.FTPFile;

import org.apache测试数据mons.net.ftp.FTPReply;

 

import java.io.*;

 

/**

  * @Description: ftp上传下载工具类

  * @Author: jinhaoxun

  * @Date: 2020/1/16 15:46

  * @Version: 1.0.0

  */

@Slf4j

public class FtpUtils {

 

   public static void main(String[] args) throws Exception {

     log.info( "测试开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );

     // 1

     File file = new File( "E:\\2.xlsx" );

     InputStream inputStream = new FileInputStream(file);

     FtpUtils.uploadFile( "" , 21 , "" , "" , "/usr/local" ,

         "/testfile/" , "test.xlsx" , inputStream);

 

     // 2

     FtpUtils.downloadFile( "" , 21 , "" , "" , "/usr/local/testfile/" ,

         "test.csv" , "/Users/ao/Desktop/test.csv" );

     log.info( "测试结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );

   }

 

   /**

    * @Author: jinhaoxun

    * @Description: 向FTP服务器上传文件

    * @param host FTP服务器hostname

    * @param port FTP服务器端口

    * @param userName FTP登录账号

    * @param password FTP登录密码

    * @param basePath FTP服务器基础目录

    * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath

    * @param filename 上传到FTP服务器上的文件名

    * @param input 本地要上传的文件的 输入流

    * @Date: 2020/1/16 19:31

    * @Return: boolean

    * @Throws: Exception

    */

   public static boolean uploadFile(String host, int port, String userName, String password, String basePath,

                    String filePath, String filename, InputStream input) throws Exception{

     boolean result = false ;

     FTPClient ftp = new FTPClient();

     try {

       int reply;

       // 连接FTP服务器

       ftp.connect(host, port);

       // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器

       // 登录

       ftp.login(userName, password);

       reply = ftp.getReplyCode();

       if (!FTPReply.isPositiveCompletion(reply)) {

         ftp.disconnect();

         return result;

       }

       //切换到上传目录

       if (!ftp.changeWorkingDirectory(basePath+filePath)) {

         //如果目录不存在创建目录

         String[] dirs = filePath.split( "/" );

         String tempPath = basePath;

         for (String dir : dirs) {

           if ( null == dir || "" .equals(dir)){

             continue ;

           }

           tempPath += "/" + dir;

           if (!ftp.changeWorkingDirectory(tempPath)) {

             if (!ftp.makeDirectory(tempPath)) {

               return result;

             } else {

               ftp.changeWorkingDirectory(tempPath);

             }

           }

         }

       }

       //设置上传文件的类型为二进制类型

       ftp.setFileType(FTP.BINARY_FILE_TYPE);

       //上传文件

       if (!ftp.storeFile(filename, input)) {

         return result;

       }

       input.close();

       ftp.logout();

       result = true ;

     } catch (IOException e) {

       e.printStackTrace();

     } finally {

       if (ftp.isConnected()) {

         try {

           ftp.disconnect();

         } catch (IOException ioe) {

         }

       }

     }

     return result;

   }

 

   /**

    * @Author: jinhaoxun

    * @Description: 从FTP服务器下载文件

    * @param host FTP服务器hostname

    * @param port FTP服务器端口

    * @param userName FTP登录账号

    * @param password FTP登录密码

    * @param remotePath FTP服务器上的相对路径

    * @param fileName 要下载的文件名

    * @param localPath 下载后保存到本地的路径

    * @Date: 2020/1/16 19:34

    * @Return: boolean

    * @Throws: Exception

    */

   public static boolean downloadFile(String host, int port, String userName, String password, String remotePath,

                     String fileName, String localPath) throws Exception {

 

     boolean result = false ;

     FTPClient ftp = new FTPClient();

     try {

       int reply;

       ftp.connect(host, port);

       // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器

       // 登录

       ftp.login(userName, password);

       reply = ftp.getReplyCode();

       if (!FTPReply.isPositiveCompletion(reply)) {

         ftp.disconnect();

         return result;

       }

       // 转移到FTP服务器目录

       ftp.changeWorkingDirectory(remotePath);

       FTPFile[] fs = ftp.listFiles();

       for (FTPFile ff : fs) {

         if (ff.getName().equals(fileName)) {

           java.io.File localFile = new File(localPath + "/" + ff.getName());

 

           OutputStream is = new FileOutputStream(localFile);

           ftp.retrieveFile(ff.getName(), is);

           is.close();

         }

       }

       ftp.logout();

       result = true ;

     } catch (IOException e) {

       e.printStackTrace();

     } finally {

       if (ftp.isConnected()) {

         try {

           ftp.disconnect();

         } catch (IOException ioe) {

         }

       }

     }

     return result;

   } 

}

完整代码地址:https://github测试数据/luoyusoft/java-demo
注:此工程包含多个包,FtpUtils代码均在com.luoyu.java.ftp包下
注:此工程包含多个包,SftpUtils代码均在com.luoyu.java.sftp包下

到此这篇关于Java使用Sftp和Ftp实现对文件的上传和下载的文章就介绍到这了,更多相关Java使用Sftp和Ftp文件上传和下载内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! 

原文链接:https://HdhCmsTestjianshu测试数据/p/79dae0e59d29

查看更多关于Java使用Sftp和Ftp实现对文件的上传和下载的详细内容...

  阅读:22次