当前位置:   article > 正文

ftp|sftp上传文件(图片)到远程服务器_sftp上传文件到远程服务器

sftp上传文件到远程服务器

1.ftp上传文件

1.1相关依赖

  1. <dependency>
  2. <groupId>commons-net</groupId>
  3. <artifactId>commons-net</artifactId>
  4. <version>3.6</version>
  5. </dependency>

1.2工具类

  1. package com.hungraim.ltc.utils;
  2. import com.jcraft.jsch.Channel;
  3. import com.jcraft.jsch.ChannelSftp;
  4. import com.jcraft.jsch.JSch;
  5. import com.jcraft.jsch.Session;
  6. import org.apache.commons.net.ftp.FTP;
  7. import org.apache.commons.net.ftp.FTPClient;
  8. import org.apache.commons.net.ftp.FTPConnectionClosedException;
  9. import org.apache.commons.net.ftp.FTPReply;
  10. import java.io.File;
  11. import java.io.FileInputStream;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. import java.util.Properties;
  17. public class FtpUpload {
  18. public static void main(String[] args) throws Exception {
  19. String host = "121.5.28.29";
  20. Integer port = 22;
  21. String userName = "user";
  22. String password = "123456";
  23. File file = new File("E:\\DevTool\\image\\a.jpg");
  24. // ftp
  25. FTPClient ftpClient = new FTPClient();
  26. // 设置连接使用的字符编码。必须在建立连接之前设置。
  27. ftpClient.setControlEncoding("UTF-8");
  28. try {
  29. // 连接服务端
  30. ftpClient.connect(host, port);
  31. System.out.println("连接服务器" + host + ":" + port);
  32. // ftp操作可能会返回一些响应信息,可以打印出来看看
  33. // showServerReply(ftpClient);
  34. // 尝试连接后,检查响应码以确认成功
  35. int replyCode = ftpClient.getReplyCode();
  36. if (!FTPReply.isPositiveCompletion(replyCode)) {
  37. disconnectQuietly(ftpClient);
  38. System.out.println("服务器拒绝连接");
  39. return;
  40. }
  41. } catch (IOException e) {
  42. disconnectQuietly(ftpClient);
  43. System.out.println("连接ftp失败");
  44. e.printStackTrace();
  45. return;
  46. }
  47. try {
  48. // 登录ftp
  49. boolean success = ftpClient.login(userName, password);
  50. if (!success) {
  51. ftpClient.logout();
  52. System.out.println("客户端登录失败");
  53. return;
  54. }
  55. System.out.println("客户端登录成功");
  56. // 大部分情况,上传文件时,需要设置这两项
  57. // 设置文件传输类型为二进制文件类型
  58. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  59. // 设置被动模式
  60. ftpClient.enterLocalPassiveMode();
  61. boolean done = false;
  62. try (final InputStream input = new FileInputStream(file)) {
  63. // 设置上传到ftp上使用的文件名和路径
  64. String remote = "testUpload/" + file.getName();
  65. // 上传文件
  66. done = ftpClient.storeFile(remote, input);
  67. }
  68. if (done) {
  69. System.out.println("上传文件" + file.getName() + "成功");
  70. // ftpClient.completePendingCommand();
  71. } else {
  72. System.out.println("上传文件" + file.getName() + "失败");
  73. showServerReply(ftpClient);
  74. }
  75. ftpClient.noop(); // check that control connection is working OK
  76. ftpClient.logout();
  77. } catch(FTPConnectionClosedException e) {
  78. System.out.println("服务端关闭连接");
  79. e.printStackTrace();
  80. } catch (IOException e) {
  81. System.out.println("客户端登录或操作失败");
  82. e.printStackTrace();
  83. } finally {
  84. disconnectQuietly(ftpClient);
  85. }
  86. }
  87. /**
  88. * 断开ftp连接
  89. */
  90. public static void disconnectQuietly(FTPClient ftpClient) {
  91. if (ftpClient.isConnected()) {
  92. try {
  93. ftpClient.disconnect();
  94. } catch (IOException ex) {
  95. // do nothing
  96. }
  97. }
  98. }
  99. /**
  100. * 打印服务器返回信息
  101. */
  102. public static void showServerReply(FTPClient ftpClient) {
  103. String[] replies = ftpClient.getReplyStrings();
  104. if (replies != null && replies.length > 0) {
  105. for (String aReply : replies) {
  106. System.out.println("服务端响应信息: " + aReply);
  107. }
  108. }
  109. }
  110. }

ps:如若出现报错,连接ftp失败,在Telnet以及确认无防火墙拦截的情况下,说明服务器不支持ftpClient连接方式。

  1. org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
  2. Server Reply: SSH-2.0-OpenSSH_8.0
  3. at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:344)
  4. at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:300)
  5. at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:438)
  6. at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:962)
  7. at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:950)
  8. at org.apache.commons.net.SocketClient._connect(SocketClient.java:244)
  9. at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)
  10. at com.hungraim.ltc.utils.FtpUpload.main(FtpUpload.java:32)

可以尝试以下方式。

2.sftp上传文件

2.1相关依赖

  1. <dependency>
  2. <groupId>com.jcraft</groupId>
  3. <artifactId>jsch</artifactId>
  4. <version>0.1.49</version>
  5. </dependency>

2.2工具类

  1. package com.hungraim.ltc.utils;
  2. import com.jcraft.jsch.*;
  3. import java.io.*;
  4. import java.util.Properties;
  5. public class SFTPUtil {
  6. //用户名
  7. private String username;
  8. //密码
  9. private String password;
  10. //ip
  11. private String host;
  12. //端口一般为22
  13. private int port;
  14. //私钥
  15. private String privateKey;
  16. ChannelSftp sftp = null;
  17. //通过构造方法传参
  18. public FileUtil(String username, String password, String host, int port){
  19. this.username = username;
  20. this.password = password;
  21. this.host = host;
  22. this.port = port;
  23. }
  24. public FileUtil(String username, String host, int port, String privateKey){
  25. this.username = username;
  26. this.host = host;
  27. this.port = port;
  28. this.privateKey = privateKey;
  29. }
  30. //登录,检查链接情况
  31. public void login(){
  32. try {
  33. JSch jSch = new JSch();
  34. if(privateKey != null){
  35. jSch.addIdentity(privateKey);
  36. }
  37. Session session = jSch.getSession(username,host,port);
  38. if(password != null){
  39. session.setPassword(password);
  40. }
  41. session.setTimeout(100000);
  42. Properties config = new Properties();
  43. config.put("StrictHostKeyChecking", "no");
  44. session.setConfig(config);
  45. session.connect();
  46. Channel channel = session.openChannel("sftp");
  47. channel.connect();
  48. sftp = (ChannelSftp) channel;
  49. System.out.println("登录成功");
  50. } catch (JSchException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. //上传文件
  55. /**
  56. * @param basePath 目标路径
  57. * @param direcotry 目标子路径
  58. * @param sftpFileName 文件名称
  59. */
  60. public void upload(String basePath, String direcotry, String sftpFileName, InputStream inputStream) throws SftpException{
  61. try {
  62. //进入到目标目录
  63. sftp.cd(basePath);
  64. sftp.cd(direcotry);
  65. } catch (SftpException e) {
  66. String[] dirs = direcotry.split("/");
  67. String temPath = basePath;
  68. for (String dir: dirs) {
  69. if( null == dir || "".equals(dir)) continue;
  70. temPath +="/" + dir;
  71. try {
  72. sftp.cd(temPath);
  73. } catch (SftpException ex) {
  74. sftp.mkdir(temPath);
  75. sftp.cd(temPath);
  76. }
  77. }
  78. }
  79. sftp.put(inputStream,sftpFileName);
  80. System.out.println("上传成功");
  81. }
  82. //下载文件
  83. /**
  84. * @param directory 下载的文件路径
  85. * @param downloadFile 下载的文件名
  86. * @param saveFileDirectory 保存的文件路径
  87. */
  88. public void download(String directory, String downloadFile, String saveFileDirectory) throws SftpException, FileNotFoundException{
  89. if(directory != null && !"".equals(directory)){
  90. sftp.cd(directory);
  91. }
  92. String saveFile = saveFileDirectory + "//" + downloadFile;
  93. File file = new File(saveFile);
  94. sftp.get(downloadFile, new FileOutputStream(file));
  95. System.out.println("下载成功");
  96. }
  97. //登出
  98. public static void main(String[] args) throws FileNotFoundException,SftpException {
  99. FileUtil fiel = new FileUtil("username","pwd","ip",port);
  100. fiel.login();
  101. //测试上传功能
  102. File file = new File("E:\\DevTool\\image\\a.jpg");
  103. InputStream is = new FileInputStream(file);
  104. fiel.upload("/projects/gxyx/file","/startSrv","a.jpg",is);
  105. }
  106. }

亲测可行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/559444
推荐阅读
相关标签
  

闽ICP备14008679号