首先导入maven坐标依赖
<!-- FTP工具类 -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<!-- jcraft操作SFTP工具类-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
然后创建一个实体类 用来写入服务器账号密码
package com.fosun.user.common.bean;
import lombok.Data;
@Data
public class SftpConfig {
private String hostname="172.16.60.70";
private Integer port=22;// 服务器默认端口一般不需要修改
private String username="ceshi";
private String password="z1LPevq25E!";
private Integer timeout=6000;
private String remoteRootPath;
private String fileSuffix;
}
Controller层代码实现
package com.fosun.user.controller;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fosun.user.bo.AccountBo;
import com.fosun.user.common.result.ReturnCodeEnum;
import com.fosun.user.entity.User;
import com.fosun.user.service.IUserService;
import com.fosun.util.result.ResultVO;
import com.fosun.util.token.TokenUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
@Slf4j
@Api(description = "实名用户管理")
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@ApiOperation("图片写入到ftp服务器")
@PostMapping(value = "/uploadPictures")
public ResultVO uploadToAli(@RequestParam(value = "file", required = false) MultipartFile file) {
String url;
String name = file.getOriginalFilename();
try {
//获取图片扩展名
String ext = name.substring(name.lastIndexOf(".") + 1);
url = UUID.randomUUID().toString().replace("-", "") + "." + ext;
SFTP sftp = new SFTP();
SftpConfig sftpConfig = new SftpConfig();
sftp.upload("/home/fosunuhi/resources/user", file.getInputStream(), url, sftpConfig);
String imageUrl = "http://172.16.64.71:18081/user/" + url;
return ResultVO.ok(imageUrl);
} catch (Exception e) {
return ResultVO.error();
}
}
}
SFTP工具类
package com.fosun.user.common.util;
import com.fosun.user.common.bean.SftpConfig;
import com.jcraft.jsch.*;
import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
@Component
public class SFTP {
private long count;
/**
* 已经连接次数
*/
private long count1 = 0;
private long sleepTime;
/**
* 连接sftp服务器
*
* @return
*/
public ChannelSftp connect(SftpConfig sftpConfig) {
ChannelSftp sftp = null;
try {
JSch jsch = new JSch();
jsch.getSession(sftpConfig.getUsername(), sftpConfig.getHostname(), sftpConfig.getPort());
Session sshSession = jsch.getSession(sftpConfig.getUsername(), sftpConfig.getHostname(), sftpConfig.getPort());
System.out.println("Session created ... UserName=" + sftpConfig.getUsername() + ";host=" + sftpConfig.getHostname() + ";port=" + sftpConfig.getPort());
sshSession.setPassword(sftpConfig.getPassword());
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.setTimeout(sftpConfig.getTimeout());
sshSession.connect();
System.out.println("Session connected ...");
System.out.println("Opening Channel ...");
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
System.out.println("登录成功");
} catch (Exception e) {
try {
count1 += 1;
if (count == count1) {
throw new RuntimeException(e);
}
Thread.sleep(sleepTime);
System.out.println("重新连接....");
connect(sftpConfig);
} catch (InterruptedException e1) {
throw new RuntimeException(e1);
}
}
return sftp;
}
/**
*
* @param directory 路径
* @param inputStream 上传流
* @param name 文件名称
* @param sftpConfig 配置
*/
public void upload(String directory, InputStream inputStream,String name, SftpConfig sftpConfig) {
ChannelSftp sftp = connect(sftpConfig);
try {
sftp.cd(directory);
} catch (SftpException e) {
try {
sftp.mkdir(directory);
sftp.cd(directory);
} catch (SftpException e1) {
throw new RuntimeException("ftp创建文件路径失败" + directory);
}
}
try {
sftp.put(inputStream, name);
} catch (Exception e) {
throw new RuntimeException("sftp异常" + e);
} finally {
disConnect(sftp);
closeStream(inputStream, null);
}
}
/**
* 下载文件
*
* @param directory 下载目录
* @param downloadFile 下载的文件
* @param saveFile 存在本地的路径
* @param sftpConfig
*/
public void download(String directory, String downloadFile, String saveFile, SftpConfig sftpConfig) {
OutputStream output = null;
try {
File localDirFile = new File(saveFile);
// 判断本地目录是否存在,不存在需要新建各级目录
if (!localDirFile.exists()) {
localDirFile.mkdirs();
}
ChannelSftp sftp = connect(sftpConfig);
sftp.cd(directory);
output = new FileOutputStream(new File(saveFile.concat(File.separator).concat(downloadFile)));
sftp.get(downloadFile, output);
disConnect(sftp);
} catch (Exception e) {
throw new RuntimeException("文件下载出现异常,[{}]", e);
} finally {
closeStream(null, output);
}
}
public void writeFileToRes(HttpServletResponse response, SftpConfig sftpConfig, String path) {
InputStream inputStream = null;
ServletOutputStream outputStream = null;
try {
ChannelSftp sftp = connect(sftpConfig);
sftp.cd("\\EFT");
sftp.cd("\\BANKSLIPS");
sftp.cd("\\PDF");
inputStream = sftp.get(path);
byte[] buf = new byte[1024 * 10];
outputStream = response.getOutputStream();
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(path, "UTF-8"));
int readLength;
while (((readLength = inputStream.read(buf)) != -1)) {
outputStream.write(buf, 0, readLength);
}
outputStream.flush();
} catch (SftpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
closeStream(null, outputStream);
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 下载远程文件夹下的所有文件
*
* @param remoteFilePath
* @param localDirPath
* @throws Exception
*/
public void getFileDir(String remoteFilePath, String localDirPath, SftpConfig sftpConfig) throws Exception {
File localDirFile = new File(localDirPath);
// 判断本地目录是否存在,不存在需要新建各级目录
if (!localDirFile.exists()) {
localDirFile.mkdirs();
}
ChannelSftp channelSftp = connect(sftpConfig);
Vector<ChannelSftp.LsEntry> lsEntries = channelSftp.ls(remoteFilePath);
for (ChannelSftp.LsEntry entry : lsEntries) {
String fileName = entry.getFilename();
if (checkFileName(fileName)) {
continue;
}
String remoteFileName = getRemoteFilePath(remoteFilePath, fileName);
channelSftp.get(remoteFileName, localDirPath);
}
disConnect(channelSftp);
}
/**
* 关闭流
*
* @param outputStream
*/
private void closeStream(InputStream inputStream, OutputStream outputStream) {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private boolean checkFileName(String fileName) {
if (".".equals(fileName) || "..".equals(fileName)) {
return true;
}
return false;
}
private String getRemoteFilePath(String remoteFilePath, String fileName) {
if (remoteFilePath.endsWith("/")) {
return remoteFilePath.concat(fileName);
} else {
return remoteFilePath.concat("/").concat(fileName);
}
}
/**
* 删除文件
*
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
* @param sftp
*/
public void delete(String directory, String deleteFile, ChannelSftp sftp) {
try {
sftp.cd(directory);
sftp.rm(deleteFile);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 列出目录下的文件
*
* @param directory 要列出的目录
* @param sftpConfig
* @return
* @throws SftpException
*/
public List<String> listFiles(String directory, SftpConfig sftpConfig) throws SftpException {
ChannelSftp sftp = connect(sftpConfig);
List fileNameList = new ArrayList();
try {
sftp.cd(directory);
} catch (SftpException e) {
return fileNameList;
}
Vector vector = sftp.ls(directory);
for (int i = 0; i < vector.size(); i++) {
if (vector.get(i) instanceof ChannelSftp.LsEntry) {
ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry) vector.get(i);
String fileName = lsEntry.getFilename();
if (".".equals(fileName) || "..".equals(fileName)) {
continue;
}
fileNameList.add(fileName);
}
}
disConnect(sftp);
return fileNameList;
}
/**
* 断掉连接
*/
public void disConnect(ChannelSftp sftp) {
try {
sftp.disconnect();
sftp.getSession().disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public SFTP(long count, long sleepTime) {
this.count = count;
this.sleepTime = sleepTime;
}
public SFTP() {
}
}