公司需求是写一个上传文件的页面,一开始用ftp的上传方法,但是没有成功;后来发现公司用的服务器是sftp协议的……而sftp的写法和ftp 的写法不一样。
下面记录这两种写法:
另外注意引入jar包:jsch.jar
sftp的上传文件的写法:
///host:上传的 ip
//// port 接口 ftp默认21,sftp:默认22
//username:登陆的用户名 password:登陆主机的密码
//input: 输入流(文件流),name:重命名的文件名
//
publicvoid UpFileSftp(String host, int port, String username,
String password, Stringdirectory, InputStream input, String name)throws Exception{
ChannelSftp sftp = newChannelSftp();
try {
JSch jsch = new JSch();
jsch.getSession(username,host, port);
Session sshSession =jsch.getSession(username, host, port);
logger.info("---------------------Session创建了.-----------------");
sshSession.setPassword(password);
Properties sshConfig = newProperties();
// “StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接。
sshConfig.put("StrictHostKeyChecking","no");
sshSession.setConfig(sshConfig);
sshSession.connect();
logger.info("---------------------Sessionconnected.---------------");
logger.info("---------------------OpeningChannel.-----------------");
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp)channel;
logger.info("---------------------已经连接上了主机,准备上传文件-----------------------");
//设置链接之后上传文件的路径
sftp.cd(directory);
//第一个是输入流,第二个是上后命名的文件名。
sftp.put(input, name);
} catch (Exception e) {
logger.error("上传文件失败原因是:" + e.getMessage(), e);
throw new Exception(e);
} finally {
sftp.disconnect();
}
}
ftp上传文件并修改文件的方法:
@paramurl FTP服务器hostname @param port FTP服务器端口
*@param username FTP登录账号 @param password FTP登录密码
*@param path FTP服务器保存目录,如果是根目录则为"/"
*@param filename上传到FTP服务器上的文件名
*@param input 本地文件输入流
publicboolean uploadFile(String url, int port, String username,
String password, Stringpath, String filename, InputStream input) {
boolean result = false;
try {
int reply;
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
// ftpClient.connect(url);
ftpClient.connect(url,port);// 连接FTP服务器
// 登录
ftpClient.login(username,password);
ftpClient.setControlEncoding("utf-8");
// 检验是否连接成功
reply =ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)) {
System.out.println("连接失败");
ftpClient.disconnect();
return result;
}
// 转移工作目录至指定目录下
boolean change =ftpClient.changeWorkingDirectory(path);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
if (change) {
result =ftpClient.storeFile(
newString(filename.getBytes("utf-8"), "utf-8"), input);
if (result) {
System.out.println("上传成功!");
}
}
input.close();
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOExceptionioe) {
}
}
}
return result;
}
2016.5.31 -----王伟杰
http://blog.csdn.net/myfmyfmyfmyf/article/details/17262577