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上传文件
原文地址:https://www.cnblogs.com/ynhk/p/10375207.html