sftp文件上传和下载
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部份,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
下面是java 代码sftp文件上传和下载具体实现
1.连接服务器类
package Test;
import java.io.IOException;
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.Session;
/*
* @author lixiongjun
* 利用JSch包实现创建ChannelSftp通信对象的工具类
* 2015-1-27 上午10:03:21
*/
public class SftpUtil {
private static String ip = null; // ip 主机IP
private static int port = -1; // port 主机ssh2登陆端口,如果取默认值,传-1
private static String user = null; // user 主机登陆用户名
private static String psw = null; // psw 主机登陆密码
private static String servicePath = null; // 服务存储文件路径
private static Properties prop = null;
private static Session session = null;
private static Channel channel = null;
// 读取配置文件的参数
static {
prop = new Properties();
ClassLoader cl = ClassLoader();
InputStream is = cl
.getResourceAsStream("Test/Sftp_UpDownload.properties");
try {
prop.load(is);
} catch (IOException e) {
// System.out.println("读取配置文件出错!");
e.printStackTrace();
}
ip = Property("ip");
port = Integer.Property("port"));
user = Property("user");
psw = Property("psw");
servicePath = Property("servicePath");
}
/**
* 获取 sftp通信
* @return 获取到的ChannelSftp
* @throws Exception
*/
public static ChannelSftp getSftp() throws Exception {
ChannelSftp sftp = null;
JSch jsch = new JSch();
if (port <= 0) {
// 连接服务器,采用默认端口
session = Session(user, ip);
} else {
// 采用指定的端口连接服务器
session = Session(user, ip, port);
}
// 如果服务器连接不上,则抛出异常
if (session == null) {
throw new Exception("session is null");
}
// 设置登陆主机的密码
session.setPassword(psw);// 设置密码
// 设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
// 设置登陆超时时间
t(30000);
try {
// 创建sftp通信通道
channel = (Channel) session.openChannel("sftp");
t();
sftp = (ChannelSftp) channel;
// 进入服务器指定的文件夹
sftp.cd(servicePath);
} catch (Exception e) {
e.printStackTrace();
李若彤个人简介}
return sftp;背叛郭德纲的徒弟
}
读取配置文件失败/**
董浩的女儿* 关闭连接
*/
public static void closeSftp() {
if (channel != null) {
if (channel.isConnected())
channel.disconnect();
}
if (session != null) {
if (session.isConnected())
session.disconnect();
}
}
}
 
2.上传下载工具类
package Test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import org.junit.Test;
import com.jcraft.jsch.ChannelSftp;
public class SftpUploadOrDownload {
/*
* @author lixiongjun
* 实现sftp文件上传下载的工具类
* 2015-1-27 下午15:13:26
*/
/**张杰多大
* 上传本地文件到服务器
* @param srcPath 本地文件路径
* @param dstFilename 目标文件名
* @return 是否上传成功
*/
public boolean upload(String srcPath,String dstFilename){
ChannelSftp sftp=null;
try {
sftp =Sftp();
sftp.put(srcPath,dstFilename);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
finally{
SftpUtil.closeSftp();
}
}
/**
傅淼* 上传本地文件到服务器
* @param in 输入流
* @param dstFilename 目标文件名
* @return 是否上传成功
*/
public boolean uploadBystrem(InputStream in,String dstFilename){
ChannelSftp sftp=null;
try {
sftp =Sftp();
sftp.put(in,dstFilename);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
finally{
SftpUtil.closeSftp();
}
}
/**
* 把服务器文件下载到本地
* @param desPath 下载到本地的目标路径
* @param srcFilename 源文件名
* @return 是否下载成功
*/
public boolean download(String srcFilename,String dstPath){
ChannelSftp sftp=null;
try {
sftp =Sftp();
(srcFilename,dstPath);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
finally{
SftpUtil.closeSftp();
}
}
/**
* 获取服务器文件的内容,只对文本文件有效
* @param srcFilename 服务器所在源文件名
* @return 文件内容
*/
public String getServiceFileContext(String srcFilename){