sftp上传

/**
* @(#)SftpUtils.java 2015-11-13
*
* Copyright (c) 1995-2015 Wonders Information Co.,Ltd.
* 1518 Lianhang Rd,Shanghai 201112.P.R.C.
* All Rights Reserved.
*
* This software is the confidential and proprietary information of Wonders Group.
* (Social Security Department). You shall not disclose such
* Confidential Information and shall use it only in accordance with
* the terms of the license agreement you entered into with Wonders Group.
*
* Distributable under GNU LGPL license by gnu.org
*/
package com.wondersgroup.pub.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.http.HttpServletResponse;


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;
import com.wondersgroup.framework.core.web.struts2.action.BaseAjaxAction;
import com.wondersgroup.framework.mail.util.BASE64Encoder;
import com.wondersgroup.mycommom.fjxxb.vo.FjxxbVO;

/**
* sftp工具类
* @author chenyibing
* 2017-2-21
*/
public final class SftpUtils extends BaseAjaxAction{

/** ssh会话 */
private static volatile Session sshSession = null;

private static String ftpServer;
private static int ftpPort;
private static String ftpAccount;
private static String ftpPassword;
private static ChannelSftp sftp = null;

public void setFtpServer(String ftpServer) {
SftpUtils.ftpServer = ftpServer;
}

public void setFtpPort(int ftpPort) {
SftpUtils.ftpPort = ftpPort;
}

public void setFtpAccount(String ftpAccount) {
SftpUtils.ftpAccount = ftpAccount;
}

public void setFtpPassword(String ftpPassword) {
SftpUtils.ftpPassword = ftpPassword;
}

/**
* 连接sftp服务器
*
* @param host
* 主机
* @param port
* 端口
* @param username
* 用户名
* @param password
* 密码
* @return ChannelSftp
*/
public static ChannelSftp connect(String host, int port, String username,
String password) throws Exception {


Channel channel = null;

try {
JSch jsch = new JSch();

jsch.getSession(username, host, port);

sshSession = jsch.getSession(username, host, port);


sshSession.setPassword(password);

sshSession.setConfig("StrictHostKeyChecking", "no");

sshSession.connect();


channel = sshSession.openChannel("sftp");

channel.connect();

sftp = (ChannelSftp) channel;

} catch (JSchException e) {
throw new Exception("Connect to '" + host + "' fail:" + e.getMessage(), e);
} catch (Exception e) {
throw new Exception("Connect to '" + host + "' fail:" + e.getMessage(), e);
}

return sftp;
}


/**
*
* @param directory 路径
* @param uploadFile 文件名称
* @return true上传成功 fasle 上传失败
* @throws Exception
*/
public static boolean upload(
String directory, String uploadFile) throws Exception {

boolean isOk=false;

FileInputStream is = null;

try {
sftp = connect(ftpServer, ftpPort, ftpAccount, ftpPassword);

try {
sftp.cd(directory);
} catch (SftpException e) {

sftp.mkdir(directory);
sftp.cd(directory);

}

File file = new File(uploadFile);

is = new FileInputStream(file);

sftp.put(is, file.getName());
is.close();
isOk=true;


} catch (FileNotFoundException e) {
throw new Exception("file '" + uploadFile + "' not found!", e);
} catch (Exception e) {
throw new Exception("upload file '" + uploadFile + "' fail:" + e.getMessage(), e);
} finally {

disconnectSftp();
disconnectSession();
return isOk;
}
}


/**
*
* @param directory 路径
* @param fileName 文件名称
* @param file 文件
* @return true上传成功 fasle 上传失败
* @throws Exception
*/
public static boolean uploadListFile(String directory, File file,String fileName) {
boolean isOk=false;
try {
sftp = connect(ftpServer, ftpPort, ftpAccount, ftpPassword);

try {
sftp.cd(directory);
} catch (SftpException e) {

sftp.mkdir(directory);
sftp.cd(directory);

}
FileInputStream is=new FileInputStream(file);
sftp.put(is, fileName);
is.close();
isOk=true;


}catch (Exception e) {
e.printStackTrace();
//throw new Exception("upload file '" + fileName + "' fail:" + e.getMessage(), e);
} finally {

disconnectSftp();
disconnectSession();

return isOk;
}
}

/**
*
* @param directory 路径
* @param is 文件流
* @param fileName 文件名称
* @return true上传成功 fasle 上传失败
*/
public static boolean uploadInputStream(String directory, InputStream is,String fileName) {
boolean isOk=false;
try {
sftp = connect(ftpServer, ftpPort, ftpAccount, ftpPassword);

try {
sftp.cd(directory);
} catch (SftpException e) {

sftp.mkdir(directory);
sftp.cd(directory);

}
sftp.put(is, fileName);
is.close();
isOk=true;


}catch (Exception e) {
e.printStackTrace();
//throw new Exception("upload file '" + fileName + "' fail:" + e.getMessage(), e);
} finally {
disconnectSftp();
disconnectSession();
return isOk;
}
}

/**
* 下载文件
*
* @param ip
* 远程服务器ip
* @param port
* 远程服务器sftp端口号
* @param userName
* 远程服务器登录名
* @param password
* 远程服务器登录密码
* @param directory
* 下载目录
* @param downloadFile
* 下载的文件名
* @param saveFile
* 存在本地的路径
*/
public static InputStream download(String filePath,String fileName)
throws Exception {

String fileDir = filePath + "/" + fileName;
InputStream inputStream=null;
try{
sftp = connect(ftpServer, ftpPort, ftpAccount, ftpPassword);

inputStream=sftp.get(fileDir);




return inputStream;

} catch (FileNotFoundException e) {
throw new Exception("file '" + fileName + "' not found!", e);
} finally {
//System.out.println(111);
//sftp.disconnect();
//disconnectSession();

}

}

/**
* 批量下载竞赛照片
* @param fileNameList
* @return
*/
public static InputStream batchDownload(List<FjxxbVO> list){
ByteArrayOutputStream bos=new ByteArrayOutputStream();
try{
sftp = connect(ftpServer, ftpPort, ftpAccount, ftpPassword);
ZipOutputStream out = new ZipOutputStream(bos);
byte[] buf = new byte[4096];
for (FjxxbVO fjxxbVO : list) {
InputStream in = null;
try {

in=sftp.get(fjxxbVO.getLj()+"/"+fjxxbVO.getSsmc());

out.putNextEntry(new ZipEntry(fjxxbVO.getOrgname()+"."+fjxxbVO.getWjlx()));

int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();


} catch (Exception e) {
e.printStackTrace();
}

}

//inputStream=sftp.get(fileDir);
out.close();
bos.close();

} catch (FileNotFoundException e) {
} catch (Exception e) {
e.printStackTrace();
}

return new ByteArrayInputStream(bos.toByteArray());

}




public static InputStream download(String fileDir) throws Exception {

InputStream inputStream = null;
try {
sftp = connect(ftpServer, ftpPort, ftpAccount, ftpPassword);

inputStream = sftp.get(fileDir);

return inputStream;

} catch (FileNotFoundException e) {
throw new Exception("file '" + fileDir + "' not found!", e);
} finally {
// System.out.println(111);
// sftp.disconnect();
// disconnectSession();

}

}

/**
* 删除文件
*
* @param ip
* 远程服务器ip
* @param port
* 远程服务器sftp端口号
* @param userName
* 远程服务器登录名
* @param password
* 远程服务器登录密码
* @param directory
* 要删除文件所在目录
* @param deleteFile
* 要删除的文件
* @param sftp
*/
public static void delete(String directory, String deleteFile) throws Exception {


try {
sftp = connect(ftpServer, ftpPort, ftpAccount, ftpPassword);

sftp.cd(directory);
sftp.rm(deleteFile);

} catch (Exception e) {
throw new Exception("Delete file '" + deleteFile + "' fail:" + e.getMessage(),
e);
} finally {
disconnectSftp();
disconnectSession();
}
}

public static void disconnectSftp() {

if (null != sftp && sftp.isConnected()) {

sftp.disconnect();
sftp.exit();

sftp = null;
}
}

public static void disconnectSession() {

if (null != sshSession && sshSession.isConnected()) {

sshSession.disconnect();

sshSession = null;
}
}

/**
* 头像转换成base64
* @param path
* @return
*/
public static String photoToBase64(String fileDir){
try {
InputStream inputStream = SftpUtils.download(fileDir);

ByteArrayOutputStream baos = new ByteArrayOutputStream(2048*3);
for(int len;(len=inputStream.read())!=-1;){
baos.write(len);
}
baos.flush();
baos.close();
byte[] data = baos.toByteArray();
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public static void main(String[] args){
String ip = "172.16.3.165";
String userName = "root";
String password = "Root@123";
int port = 22;
String uploadFile = "D:"+File.separator+"339005000000000008.pdf";
String directory = "/home/test";
String downloadFile = "339005000000000008.pdf";
String saveFile = "D:/test";
try {
//download(directory, downloadFile, saveFile);
//upload(ip, port, userName, password, directory, uploadFile);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


// 生成文件随机名
public static String getRandomName(String filename) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String dateStr = dateFormat.format(new Date());
Random r = new Random();
Integer integer = new Integer(r.nextInt(10000));
String s = String.valueOf(integer);

filename = dateStr + s + "." + getPostfix(filename);

return filename;

}

// 获取文件类型
public static String getPostfix(String path) {
if (path == null || "".equals(path.trim())) {
return "";
}
if (path.contains(".")) {
return path.substring(path.lastIndexOf(".") + 1, path.length());
}
return "";
}

}

需要jar jsch-0.1.53.jar

原文地址:https://www.cnblogs.com/wanghongwei123/p/7154232.html