当前位置:主页 > java教程 > java使用SFTP上传文件到资源服务器

java使用SFTP上传文件到资源服务器方法详解

发布:2019-09-02 11:55:27 186


我们帮大家精选了相关的编程文章,网友蓬烨霖根据主题投稿了本篇教程内容,涉及到java、SFTP、上传文件、java使用SFTP上传文件到资源服务器相关内容,已被733网友关注,内容中涉及的知识点可以在下方直接下载获取。

java使用SFTP上传文件到资源服务器

本文实例为大家分享了java实现SFTP上传文件到资源服务器工具类,供大家参考,具体内容如下

首先得创建连接sftp服务器的公共类MySftp.java:

package cn.test.util;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;
 
import javax.servlet.http.HttpServletRequest;
 
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
 
public class MySFTP {
 
 /**
 * 连接sftp服务器
 * @param host 主机
 * @param port 端口
 * @param username 用户名
 * @param password 密码
 */
 public ChannelSftp connect(String host, int port, String username,
  String password) {
 ChannelSftp sftp = null;
 try {
  JSch jsch = new JSch();
  jsch.getSession(username, host, port);
  Session sshSession = jsch.getSession(username, host, port);
  sshSession.setPassword(password);
  Properties sshConfig = new Properties();
  sshConfig.put("StrictHostKeyChecking", "no");
  sshSession.setConfig(sshConfig);
  sshSession.connect();
  Channel channel = sshSession.openChannel("sftp");
  channel.connect();
  sftp = (ChannelSftp) channel;
 } catch (Exception e) {
  
 }
 return sftp;
 }
 
 /**
 * 上传文件
 * 
 * @param directory
 *      上传的目录
 * @param uploadFile
 *      要上传的文件
 * @param sftp
 */
 public void upload(String directory, String uploadFile, ChannelSftp sftp) {
 try {
  sftp.cd(directory);
  File file = new File(uploadFile);
  sftp.put(new FileInputStream(file), file.getName());
 } catch (Exception e) {
  e.printStackTrace();
 }
 }
 
 /**
 * 下载文件
 * 
 * @param directory
 *      下载目录
 * @param downloadFile
 *      下载的文件
 * @param saveFile
 *      存在本地的路径
 * @param sftp
 */
 public void download(String directory, String downloadFile,
  String saveFile, ChannelSftp sftp) {
 try {
  sftp.cd(directory);
  File file = new File(saveFile);
  sftp.get(downloadFile, new FileOutputStream(file));
 } catch (Exception e) {
  e.printStackTrace();
 }
 }
 
 /**
 * 删除文件
 * 
 * @param directory
 *      要删除文件所在目录
 * @param deleteFile
 *      要删除的文件
 * @param sftp
 */
 public void delete(String directory, String deleteFile, ChannelSftp sftp) {
 try {
  sftp.cd(directory);
  sftp.rm(deleteFile);
 } catch (Exception e) {
  e.printStackTrace();
 }
 }
 
 public void uploadSFTP(HttpServletRequest request,String[] uploadFiles) throws Exception {
  MySFTP mySFTP = new MySFTP();
  SFTPUtil sFTPUtil =new SFTPUtil();
  ChannelSftp sftp = null;
  Session session = null;
 try {
  sftp = mySFTP.connect(SystemConstants.SFTP_host, Integer.parseInt(SystemConstants.SFTP_port), SystemConstants.SFTP_username, SystemConstants.SFTP_password);
 
  for (int i = 0; i < uploadFiles.length; i++) {
   Date uploadTime = new Date();
   String url=request.getSession().getServletContext().getRealPath("").replaceAll("\\\\", "/"); 
   String uploadFile =url.substring(0, url.lastIndexOf("/"))+uploadFiles[i];
//   String saveFile="";
   SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
   String ymd = sdf.format(uploadTime);
   String relativePath = ymd + "/";
   String directory = SystemConstants.SFTP_directory+ relativePath;
   sFTPUtil.createDir(directory, sftp);
   mySFTP.upload(directory, uploadFile, sftp);
   sftp.cd(directory);
  }
    } catch (Exception e) {
   e.printStackTrace();
  }finally{
  try {
   if(sftp != null) {
   sftp.disconnect();
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  try {
   if(session != null) {
   session.disconnect();
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  }
 
 }
 
 /**
 * 列出目录下的文件
 * 
 * @param directory
 *      要列出的目录
 * @param sftp
 * @return
 * @throws SftpException
 */
 @SuppressWarnings("rawtypes")
 public Vector listFiles(String directory, ChannelSftp sftp)
  throws SftpException {
 return sftp.ls(directory);
 }
 
}

上传图片时,调用SFTPUtil类中的uploadMultipartFile方法即可。

package cn.test.util;
 
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
 
 
import org.springframework.web.multipart.MultipartFile;
 
 
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;

 
/**文件上传工具类*/
public class SFTPUtil {
 /**
 * spring文件上传方法
 * */
 public static String uploadMultipartFile(MultipartFile file,String fileExt) {
 SFTPUtil sFTPUtil =new SFTPUtil();
 String originalFilename = file.getOriginalFilename();
 //生成文件名
 Date uploadTime = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    String ymd = sdf.format(uploadTime);
    String relativePath = ymd+"/";
 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
 String fileName = df.format(uploadTime) + "_" + new Random().nextInt(1000) + "." + fileExt;
// String fileName = String.valueOf(new Date().getTime())+ new Random().nextInt(10000)+"."+originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
 String directory=SystemConstants.SFTP_directory+relativePath;
 ChannelSftp sftp =null;
 Session session = null;
 try {
  MySFTP mySFTP = new MySFTP();
  sftp = mySFTP.connect(SystemConstants.SFTP_host, Integer.parseInt(SystemConstants.SFTP_port), SystemConstants.SFTP_username, SystemConstants.SFTP_password);
  session = sftp.getSession();
  sFTPUtil.createDir(directory, sftp);
  sftp.cd(directory);
  sftp.put(file.getInputStream(), fileName);
  sftp.disconnect();
  sftp.getSession().disconnect();
 } catch (Exception e) {
  System.out.println("文件[" + originalFilename + "]上传失败,堆栈轨迹如下:");
  e.printStackTrace();
 }finally{
  try {
  if(sftp != null) {
   sftp.disconnect();
  }
  } catch (Exception e) {
  e.printStackTrace();
  }
  try {
  if(session != null) {
   session.disconnect();
  }
  } catch (Exception e) {
  e.printStackTrace();
  
  }
  
  
 }
 String reName=SystemConstants.SFTP_httpBaseUrl+relativePath+fileName;
 return reName;
 }
 
 
 /**
  * 创建目录
 * @throws Exception 
  */
 public void createDir(String createpath, ChannelSftp sftp) throws Exception { 
  try { 
   if (isDirExist(sftp, createpath)) { 
   sftp.cd(createpath); 
   } 
   String pathArry[] = createpath.split("/"); 
   StringBuffer filePath = new StringBuffer("/"); 
   for (String path : pathArry) { 
   if (path.equals("")) { 
    continue; 
   } 
   filePath.append(path + "/"); 
   if (isDirExist(sftp, filePath.toString())) { 
    sftp.cd(filePath.toString()); 
   } else { 
    // 建立目录 
    sftp.mkdir(filePath.toString()); 
    // 进入并设置为当前目录 
    sftp.cd(filePath.toString()); 
   } 
   } 
   sftp.cd(createpath); 
  } catch (SftpException e) {
   throw new Exception(e.getMessage());
  } 
  } 
 
 
 /** 
  * 判断目录是否存在 
  */ 
 public boolean isDirExist(ChannelSftp sftp,String directory) { 
  boolean isDirExistFlag = false; 
  try { 
  SftpATTRS sftpATTRS = sftp.lstat(directory); 
  isDirExistFlag = true; 
  return sftpATTRS.isDir(); 
  } catch (Exception e) { 
  if (e.getMessage().toLowerCase().equals("no such file")) { 
   isDirExistFlag = false; 
  } 
  } 
  return isDirExistFlag; 
 } 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。


参考资料

相关文章

  • 实例分享java AOP原理及用法

    发布:2020-03-11

    在本篇文章里我们给大家整理了关于java AOP原理以及相关知识点总结,正在学习的朋友们参考下。


  • IDEA创建SpringBoot项目整合mybatis时mysql-connector-java报错异常的详细分析

    发布:2023-03-14

    最近工作中发现了个错误,分享给同样遇到这个问题的朋友,这篇文章主要给大家介绍了关于IDEA创建SpringBoot项目整合mybatis时mysql-connector-j报错异常的详细分析,需要的朋友可以参考下


  • 一文带你厉害Java设计模式中的模板方法

    发布:2023-04-21

    模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。这篇文章就来带大家了解一下Java模板方法的概念与实现,感兴趣的小伙伴可以跟随小编一起学习一下


  • java中myeclipse创建servlet方法

    发布:2020-06-18

    这篇文章主要为大家详细介绍了myeclipse创建servlet的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Javascript编程开发细节总结

    发布:2021-05-07

    下面小编就为大家带来一篇Javascript 一些需要注意的细节(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • Java8简单了解Lambda表达式与函数式接口

    发布:2022-07-11

    为网友们分享了关于Java8的教程,这篇文章主要介绍了Java8简单了解Lambda表达式与函数式接口,具有一定参考价值,需要的朋友可以了解下。


  • java中计算集合的交差并集示例代码

    发布:2022-09-14

    给网友们整理关于java的教程,今天突然想Java如何计算集合的交差并集,主要是看Python语言的时候想起来的。下面这篇文章主要给大家介绍了关于java中计算集合的交差并集的相关资料,文中通过示例代码介绍的非常详细,需


  • Java十分钟理清面向对象与类的核心

    发布:2022-11-07

    给网友朋友们带来一篇关于Java的教程,面向对象乃是Java语言的核心,是程序设计的思想。Java语言的面向对象技术包括了面向对象和面向过程的基本概念,面向对象的特征,Java语言的类,对象,修饰符,抽象类等一系列的知识点


网友讨论