1.添加依賴
<!--sftp文件上傳-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
2.工具類
package com.nwpusct.csal.common.util;
import com.jcraft.jsch.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.*;
/**
* @ProjectName SecurityTest
* @Package com.nwpusct.csal.common.util
* @Name NdeUploadFileServerUtil
* @Author HB
* @Date 2020/5/7 0007 下午 14:10
* @Version 1.0 上傳文件到文件服務器上(CentOS系統服務器)
*/
@Component
public class FTPUtil {
private static String host;
@Value(value = "${ftp-centos.host}")
public void setHost(String hostName){
host = hostName;
}
private static Integer port;
@Value(value = "${ftp-centos.port}")
public void setPort(Integer portName) {
port = portName;
}
private static String user;
@Value(value = "${ftp-centos.user}")
public void setUser(String userName) {
user = userName;
}
private static String password;
@Value(value = "${ftp-centos.password}")
public void setPassword(String passwordName) {
password = passwordName;
}
private static String basePath;
@Value(value = "${ftp-centos.basePath}")
public void setBasePath(String basePath) {
FTPUtil.basePath = basePath;
}
public static void sshSftp(byte[] bytes, String fileName) throws Exception {
Session session = null;
Channel channel = null;
JSch jsch = new JSch();
if (port<= 0) {
//連接服務器,採用默認端口
session = jsch.getSession(user, host);
} else {
//採用指定的端口連接服務器
session = jsch.getSession(user, host, port);
}
//如果服務器連接不上,則拋出異常
if (session == null) {
throw new Exception("session is null");
}
//設置登陸主機的密碼
session.setPassword(password);
//設置第一次登陸的時候提示,可選值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
//設置登陸超時時間
session.connect(30000);
OutputStream outstream = null;
try {
//創建sftp通信通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//進入服務器指定的文件夾
sftp.cd(basePath);
//列出服務器指定的文件列表
// Vector v = sftp.ls("*");
// for(int i=0;i<v.size();i++){
// System.out.println(v.get(i));
// }
//以下代碼實現從本地上傳一個文件到服務器,如果要實現下載,對換以下流就可以了
outstream = sftp.put(fileName);
outstream.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
//關流操作
if (outstream != null) {
outstream.flush();
outstream.close();
}
if (session != null) {
session.disconnect();
}
if (channel != null) {
channel.disconnect();
}
}
}
}
3.遠程服務器配置
#上傳文件到文件服務器的配置
ftp-centos:
#IP
host: 121.46.19.23
#端口
port: 20623
user: amind
password: 123456
basePath: /home/file
4.接口代碼
package com.nwpusct.csal.controller.uploadfileserver;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.nwpusct.csal.common.util.FTPUtil;
import com.nwpusct.csal.common.util.RestResult;
import com.nwpusct.csal.common.util.RestResultUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
/**
* @ProjectName SecurityTest
* @Package com.nwpusct.csal.controller.uploadfileserver
* @Name NdeUploadFileServer
* @Author HB
* @Date 2020/5/7 0007 上午 11:07
* @Version 1.0 上傳文件到文件服務器(CentOS文件服務器)
*/
@RestController
@RequestMapping(value = "/uploadFileServer")
public class NdeUploadFileServerController {
@ApiOperation(value = "文件上傳到文件服務器")
@RequestMapping(value = "/uploadFolder", method = RequestMethod.POST)
public RestResult<Object> uploadFolder(MultipartFile file) {
try {
byte[] bytes = file.getBytes();
FTPUtil.sshSftp(bytes, file.getOriginalFilename());
return RestResultUtil.ok();
} catch (Exception e) {
e.printStackTrace();
}
return RestResultUtil.failed();
}
}