java文件上传sftp

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JackRen_Developer/article/details/86551273
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Properties;
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;

public class SftpServiceTest extends BaseAction{
 
 private static Session session;
 private static ChannelSftp sftp;

 public static void main(String[] args) throws SftpException {
   login_sftp(ip,端口号,"用户名","密码");
 }
 
 /**
  * 连接sftp服务器
  * @throws SftpException 
  */
 public static void login_sftp(String host, int port, String username, String password) throws SftpException {
   try {
     JSch jsch = new JSch();
     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;
     String orginfilename="D:/20190103164544.zip";
     FileInputStream in;
     try {
       in = new FileInputStream(new File(orginfilename));
       upload("/UP/", "TEMP", "123.zip", in);
     } catch (FileNotFoundException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
     }
     logout();
   } catch (JSchException e) {
     e.printStackTrace();
   }
 }

 /**
  * 关闭连接 server
  */
 public static void logout() {
   if (sftp != null) {
     if (sftp.isConnected()) {
       sftp.disconnect();
     }
   }
 }

 /**
  * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
  * 
  * @param basePath
  *            服务器的基础路径
  * @param directory
  *            上传到该目录
  * @param sftpFileName
  *            sftp端文件名
  * @param in
  *            输入流
  */
 public static void upload(String basePath, String directory, String sftpFileName, InputStream input) throws SftpException {
   try {
     sftp.cd(basePath);
     sftp.cd(directory);
   } catch (SftpException e) {
     // 目录不存在,则创建文件夹
     String[] dirs = directory.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, sftpFileName); // 上传文件
 }

 
}

单元测试过程代码没有问题,但是在真正应用过程中会报错,查其原因是sftp中用到的Session中把项目中的连接时间给更改了,导致项目启动过程中连接数据库失败:

解决办法是声明称sfpt中的session成局部变量即可

有问题关注公众号:

猜你喜欢

转载自blog.csdn.net/JackRen_Developer/article/details/86551273