maven依赖`
<!-- 新版本SFTP上传 -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
package com.ltmonitor.web.controller;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.UUID;
/**
* @Description
* @Author MissYu
* @Date 2020/6/3 14:54
* @Classname UploadUtil
* 支持文件或者图片的上传,SFTP
* * SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。<br>
* * SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。<br>
* * 但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。<br>
*/
@RestController
@RequestMapping("/uploadImage")
public class SftpUploadController {
private static ChannelSftp sftp = null;
//ftp服务器ip地址
private static final String FTP_ADDRESS = "192.168.1.***";
//端口号,SFTP用的是Linux账号密码,注意.
private static final int FTP_PORT = 55555;
//用户名
private static final String FTP_USERNAME = "****";
//密码
private static final String FTP_PASSWORD = "**********";
//附件路径,自定义
public static final String FTP_BASEPATH = "/media/baseImage/01";
//访问路径
private static final String pathPrefix = "http://192.168.1.***:8012/media/baseImage/01/";
/**
* 上传图片或者文件到服务器
* file不用传递参数,它是一个流文件,file有没有都没有意义.
*
* @param file,
* @return
* @throws IOException
*/
@RequestMapping("/newFtpUpload")
public static String newFtpUpload(@RequestParam("file") MultipartFile file) throws IOException {
//获取到文件的文件名
String fileName = file.getOriginalFilename();
//根据文件名+UUID生产新的文件名
String newFileName = UUID.randomUUID() + fileName;
//从MultipartFile对象中获取流
InputStream inputStream = null;
inputStream = file.getInputStream();
//判断是否成功的boolean值
boolean success = false;
String path = "";
//Session对象
Session session = null;
try {
//创建JSch对象
JSch jSch = new JSch();
//调用JSch对象的getSession方法(参数是服务器的访问用户名,服务器访问路径,服务器的端口号)给session赋值
session = jSch.getSession(FTP_USERNAME, FTP_ADDRESS, FTP_PORT);
//给session对象设置密码参数也就是你的服务器访问的密码
session.setPassword(FTP_PASSWORD);
//创建参数
Properties sshConfig = new Properties();
//给参数对象赋值,这里解决
sshConfig.put("StrictHostKeyChecking", "no");
//这里设置参数给session主要解决把kerberos认证方式去掉,如果不写这一步走到这里你需要向控制台输入你的
// kerberos用户名和口令,如果你的项目环境没有涉及到kerberos应该是不用设置
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
//把参数对象给session对象注入
session.setConfig(sshConfig);
//打开session连接
session.connect(15000);
//使用session对象连接服务器
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
//使用ChannelSftp对象进行使用命令
//进入需要进入的路径
sftp.cd(FTP_BASEPATH);
//进行文件上传
sftp.put(inputStream, newFileName);
//设置上传成功
success = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
if (sftp != null) {
if (sftp.isConnected()) {
sftp.disconnect();
}
}
//关闭session
if (session != null) {
if (session.isConnected()) {
session.disconnect();
}
}
}
//判断是否成功
if (success) {
//设置返回路径为访问路径(你的服务器访问路径+新文件名)
path = pathPrefix + newFileName;
//response.getSession().getServletContext().getRealPath("/")
}
return path;
}
}
controller无法本地,测试这里配上postman测试截图
如果你需要登录的话,需要先登录,提醒.
结束,