评论

收藏

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

编程语言 编程语言 发布于:2021-10-06 15:33 | 阅读数:369 | 评论:0

这篇文章主要介绍了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; 
 } 
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/feifuzeng/article/details/71159162

关注下面的标签,发现更多相似文章