linus jsch上传文件
Posted ynhk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linus jsch上传文件相关的知识,希望对你有一定的参考价值。
package com.osplat.util;
import java.io.*;
import com.jcraft.jsch.*;
import com.osplat.bean.Resultmodel;
import org.springframework.web.multipart.MultipartFile;
/**
* @Company:wftdlx
* @Author: wjf
* @Description: linus 文件上传
* @Date: Created in 10:33 2019/2/14
*/
public class FtpsFileList {
//jar包
/*
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.49</version>
</dependency>*/
//测试程序
/*@PostMapping("/uploadImage")
@ResponseBody
public Resultmodel uploadImage(@RequestParam MultipartFile file) {
if (file==null) {
String msg="上传文件不能为空";
Log.info(msg);
return new Resultmodel(0,"上传失败");
}
Resultmodel resultmodel=null;
try {
resultmodel = FtpsFileList.sshSftp(file);
} catch (Exception e) {
System.out.println("上传失败"+e.getMessage());
return new Resultmodel(0,"上传失败");
}
Object fileName=resultmodel.getData();
return new Resultmodel(0,"上传成功",fileName);
}*/
public static String user = "root";
public static String ip = "111.111.1.11";
public static int port = 22;
public static String psw = "123456";
public static String uploadFileName = UuidUtil.get32UUID();
/**
* 利用JSch包实现SFTP下载、上传文件(用户名密码方式登陆)
* <p>
* ip 主机IP
* user 主机登陆用户名
* psw 主机登陆密码
* port 主机ssh2登陆端口,如果取默认值(默认值22),传-1
*/
public static Resultmodel sshSftp(MultipartFile file) throws Exception {
Log.info("开始用户名密码方式登陆");
Session session = null;
JSch jsch = new JSch();
if (port <= 0) {
//连接服务器,采用默认端口
session = jsch.getSession(user, ip);
} else {
//采用指定的端口连接服务器
session = jsch.getSession(user, ip, port);
}
//如果服务器连接不上,则抛出异常
if (session == null) {
throw new Exception("session is null");
}
//设置登陆主机的密码
session.setPassword(psw);//设置密码
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
//设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
//设置登陆超时时间
session.connect(2000000);
String allName = uploadFileName + file.getOriginalFilename();
sftp(session, allName, file);//allName 上传文件后重命名
Log.info("sftp成功");
return new Resultmodel(0, "文件上传成功", allName);
}
private static void sftp(Session session, String uploadFileName, MultipartFile file) throws Exception {
Channel channel = null;
try {
//创建sftp通信通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//进入服务器指定的文件夹
sftp.cd("/home/numa/image");
//列出服务器指定的文件列表
/*Vector v = sftp.ls("*.txt");
for (int i = 0; i < v.size(); i++) {
System.out.println(v.get(i));
}*/
//以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了
OutputStream outstream = sftp.put(uploadFileName);//上传文件重名
//MultipartFile转File
File f = null;
try {
f = File.createTempFile("tmp", null);
file.transferTo(f);
} catch (Exception e) {
e.printStackTrace();
}
//上传流
InputStream instream = new FileInputStream(f);//上传文件内容
byte b[] = new byte[1024];
int n;
while ((n = instream.read(b)) != -1) {
outstream.write(b, 0, n);
}
outstream.flush();
outstream.close();
instream.close();
} catch (Exception e) {
e.printStackTrace();
Log.error("文件上传util报错" + e.getMessage());
} finally {
session.disconnect();
channel.disconnect();
}
}
/**
* 利用JSch包实现SFTP下载、上传文件(秘钥方式登陆)
*
* @param ip 主机IP
* @param user 主机登陆用户名
* @param port 主机ssh2登陆端口,如果取默认值(默认值22),传-1
* @param privateKey 密钥文件路径
* @param passphrase 密钥的密码
*/
/* public static void sshSftp2(String ip, String user
, int port, String privateKey, String passphrase) throws Exception {
System.out.println("开始秘钥方式登陆");
Session session = null;
JSch jsch = new JSch();
//设置密钥和密码
//支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了
if (privateKey != null && !"".equals(privateKey)) {
if (passphrase != null && "".equals(passphrase)) {
//设置带口令的密钥
jsch.addIdentity(privateKey, passphrase);
} else {
//设置不带口令的密钥
jsch.addIdentity(privateKey);
}
}
if (port <= 0) {
//连接服务器,采用默认端口
session = jsch.getSession(user, ip);
} else {
//采用指定的端口连接服务器
session = jsch.getSession(user, ip, port);
}
//如果服务器连接不上,则抛出异常
if (session == null) {
throw new Exception("session is null");
}
//设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
//设置登陆超时时间
session.connect(30000);
sftp(session, "bb.log");
System.out.println("sftp成功");
}*/
}
以上是关于linus jsch上传文件的主要内容,如果未能解决你的问题,请参考以下文章