feature:进项的ssh 改为ftp协议和本地存储

release
gaorl 2 years ago
parent 4b81637ffa
commit 8cffce33b7
  1. 2
      dxhy-oss/src/main/java/com/dxhy/oss/config/OssReturnConfig.java
  2. 196
      dxhy-oss/src/main/java/com/dxhy/oss/service/FtpService.java
  3. 98
      dxhy-oss/src/main/java/com/dxhy/oss/service/impl/FileServiceImpl.java
  4. 53
      dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpFactory.java
  5. 14
      dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpPool.java
  6. 5
      dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpProperties.java

@ -17,6 +17,8 @@ public interface OssReturnConfig {
String FTP = "FTP"; String FTP = "FTP";
String LOCAL = "LOCAL";
String TOS = "TOS"; String TOS = "TOS";
String MINIO = "MINIO"; String MINIO = "MINIO";

@ -1,25 +1,16 @@
package com.dxhy.oss.service; package com.dxhy.oss.service;
import cn.hutool.core.io.FileUtil;
import com.dxhy.oss.utils.SftpPool; import com.dxhy.oss.utils.SftpPool;
import com.jcraft.jsch.ChannelSftp; import com.dxhy.oss.utils.SftpPoolException;
import com.jcraft.jsch.SftpException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPFile;
import java.io.File; import java.io.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* @author jiaohongyang
*/
@Slf4j @Slf4j
public class FtpService { public class FtpService {
@ -30,67 +21,21 @@ public class FtpService {
} }
/** /**
* 将输入流的数据上传到sftp作为文件文件完整路径 = basePath+directory * ftp上传文件
* *
* @param pathName ftp服务保存地址完整路径 * @param serviceDec
* @param fileName 上传到ftp的文件名 * @param fileName
* @param originFileName 待上传文件的名称绝对地址 * @param localDec 本地目录
* @return
*/ */
public boolean uploadFile( String serviceDec, String fileName, String localDec) throws InterruptedException {
public boolean uploadFile(String pathName, String fileName, String originFileName) throws InterruptedException { FTPClient ftpClient = null;
log.info("开始上传文件"); InputStream inputStream = null;
ChannelSftp sftp = null; boolean result =true;
InputStream inputStream;
try {
sftp = pool.borrowObject();
try {
sftp.cd(pathName);
} catch (SftpException e) {
// 目录不存在,则创建文件夹
String[] dirs = pathName.split("/");
String tempPath = "";
for (String dir : dirs) {
if (null == dir || "".equals(dir)) {
continue;
}
tempPath += "/" + dir;
try {
sftp.cd(tempPath);
} catch (SftpException ex) {
try {
sftp.mkdir(tempPath);
sftp.cd(tempPath);
} catch (SftpException e1) {
e1.printStackTrace();
}
}
}
}
File orgFile = new File(originFileName);
inputStream = Files.newInputStream(orgFile.toPath());
sftp.put(inputStream, fileName);
inputStream.close();
// 删除本地文件,防止服务器空间不足
FileUtil.del(orgFile);
log.info("上传文件成功");
return true;
} catch (Exception e) {
e.printStackTrace();
log.info("上传文件失败");
return false;
} finally {
if (sftp != null) {
log.info("回收线程");
pool.returnObject(sftp);
}
}
}
public static boolean uploadFile(FTPClient ftpClient, String serviceDec, String fileName, InputStream inputStream) {
try { try {
inputStream = new FileInputStream(new File(localDec));
log.info("开始上传文件"); log.info("开始上传文件");
ftpClient = pool.borrowObject();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
createDirecroty(ftpClient, serviceDec); createDirecroty(ftpClient, serviceDec);
ftpClient.makeDirectory(serviceDec); ftpClient.makeDirectory(serviceDec);
@ -100,7 +45,9 @@ public class FtpService {
ftpClient.logout(); ftpClient.logout();
log.info("上传文件成功"); log.info("上传文件成功");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
log.error("上传文件失败" + e); log.error("上传文件失败" + e);
result =false;
} finally { } finally {
try { try {
if (ftpClient.isConnected()) { if (ftpClient.isConnected()) {
@ -111,10 +58,26 @@ public class FtpService {
} }
} catch (IOException e) { } catch (IOException e) {
log.error("上传文件失败" + e); log.error("上传文件失败" + e);
result =false;
}
}
return result;
}
public boolean deleteFile(String directory, String deleteFile) {
FTPClient ftpClient = null;
try {
ftpClient = pool.borrowObject();
return ftpClient.deleteFile(directory + File.separator + deleteFile);
} catch (Exception e) {
e.printStackTrace();
return false; return false;
} finally {
if (ftpClient != null) {
log.info("回收线程");
pool.returnObject(ftpClient);
} }
} }
return true;
} }
private static boolean createDirecroty(FTPClient ftpClient, String remote) throws IOException { private static boolean createDirecroty(FTPClient ftpClient, String remote) throws IOException {
@ -232,20 +195,41 @@ public class FtpService {
} }
return list; return list;
} }
public File downloadFile(FTPClient ftpClient, String servicePath, String fileName, String localFilePath) { /**
* @param servicePath ftp的路径
* @param fileName 文件名称
* @param localFilePath 下载到本地的文件夹
* @return
*/
public boolean downloadFile(String servicePath, String fileName, String localFilePath) {
FTPClient ftpClient;
try {
ftpClient = pool.borrowObject();
String name = dowFile(ftpClient, servicePath, fileName, localFilePath); String name = dowFile(ftpClient, servicePath, fileName, localFilePath);
if (name != null && !name.equals("")){ if (name != null && !name.equals("")){
return new File(fileName); return true;
} }
return null; } catch (SftpPoolException e) {
e.printStackTrace();
}
return false;
} }
/**
*
* @param ftpClient
* @param servicePath ftp的路径
* @param fileName 文件名称
* @param localFilePath 下载到本地的文件夹
* @return
*/
private static String dowFile(FTPClient ftpClient, String servicePath, String fileName, String localFilePath) { private static String dowFile(FTPClient ftpClient, String servicePath, String fileName, String localFilePath) {
InputStream is = null; InputStream is = null;
FileOutputStream fos = null; FileOutputStream fos = null;
try { try {
ftpClient.enterLocalPassiveMode(); ftpClient.enterLocalPassiveMode();
is = ftpClient.retrieveFileStream(servicePath + fileName);// 获取ftp上的文件 is = ftpClient.retrieveFileStream(servicePath + fileName);// 获取ftp上的文件
directoryIsExists(localFilePath);
fos = new FileOutputStream(new File(localFilePath + fileName)); fos = new FileOutputStream(new File(localFilePath + fileName));
// 文件读取方式一 // 文件读取方式一
int i; int i;
@ -253,16 +237,14 @@ public class FtpService {
while ((i = is.read(bytes)) != -1) { while ((i = is.read(bytes)) != -1) {
fos.write(bytes, 0, i); fos.write(bytes, 0, i);
} }
// 文件读取方式二
//ftpClient.retrieveFile(ftpFilePath, new FileOutputStream(new File(localFilePath)));
ftpClient.completePendingCommand(); ftpClient.completePendingCommand();
log.info("FTP文件下载成功!"); log.info("FTP文件下载成功!");
} catch (Exception e) { } catch (Exception e) {
log.error("FTP文件下载失败!" + e); log.error("FTP文件下载失败!" + e);
} finally { } finally {
try { try {
if (fos != null) fos.close(); if (fos != null) {fos.close();}
if (is != null) is.close(); if (is != null) {is.close();}
} catch (IOException e) { } catch (IOException e) {
log.error("下载流关闭失败" + e); log.error("下载流关闭失败" + e);
return null; return null;
@ -271,68 +253,8 @@ public class FtpService {
return localFilePath + fileName; return localFilePath + fileName;
} }
public boolean downloadFile(String directory, String downloadFile, String saveFile) {
log.info("开始下载文件!");
ChannelSftp sftp = null;
try {
sftp = pool.borrowObject();
if (directory != null && !"".equals(directory)) {
sftp.cd(directory);
}
String file = saveFile + "/" + downloadFile;
File fileLocal = new File(file);
if (fileLocal.exists()) {
boolean delete = fileLocal.delete();
log.info("删除本地路径文件:{}", delete);
}
this.directoryIsExists(saveFile);
sftp.get(downloadFile, file);
log.info("下载文件成功!");
return true;
} catch (Exception e) {
e.printStackTrace();
log.info("下载文件失败!");
return false;
} finally {
if (sftp != null) {
log.info("回收线程");
pool.returnObject(sftp);
}
}
}
/**
* 删除文件
*
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
* @return 返回是否删除成功
*/
public boolean deleteFile(String directory, String deleteFile) {
ChannelSftp sftp = null;
try {
sftp = pool.borrowObject();
sftp.cd(directory);
sftp.rm(deleteFile);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (sftp != null) {
log.info("回收线程");
pool.returnObject(sftp);
}
}
}
public void directoryIsExists(String path) { public static void directoryIsExists(String path) {
File directory = new File(path); File directory = new File(path);
if (directory.exists()) { if (directory.exists()) {
return; return;

@ -13,6 +13,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/** /**
* @author jiaohongyang * @author jiaohongyang
@ -42,7 +45,7 @@ public class FileServiceImpl implements FileService {
* @throws Exception 异常 * @throws Exception 异常
*/ */
@Override @Override
public FileModel uploadFile(String fileName, String originFileName) throws Exception { public FileModel uploadFile(String fileName, String originFileName) {
log.info("上传文件地址:{} , 本地存储文件地址:{}", fileName, originFileName); log.info("上传文件地址:{} , 本地存储文件地址:{}", fileName, originFileName);
FileModel fileModel; FileModel fileModel;
if (OssReturnConfig.AL.equals(ossConfig.getOssType())) { if (OssReturnConfig.AL.equals(ossConfig.getOssType())) {
@ -64,7 +67,54 @@ public class FileServiceImpl implements FileService {
String directory = fileName.substring(0, fileName.lastIndexOf("/")); String directory = fileName.substring(0, fileName.lastIndexOf("/"));
File directoryFile = new File(fileName); File directoryFile = new File(fileName);
String downloadFileName = directoryFile.getName(); String downloadFileName = directoryFile.getName();
boolean b = ftpService.uploadFile(directory, downloadFileName, originFileName); boolean b = false;
try {
b = ftpService.uploadFile(directory, downloadFileName, originFileName);
} catch (InterruptedException e) {
log.error(e.getMessage());
}
fileModel = new FileModel();
fileModel.setFilePath(fileName);
if (b) {
fileModel.setCode(OssReturnConfig.SUCCESS);
} else {
fileModel.setCode(OssReturnConfig.ERROR_09);
}
} else if(OssReturnConfig.LOCAL.equals(ossConfig.getOssType())){
//创建目录
boolean b = false;
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File directory = new File(fileName.substring(0, fileName.lastIndexOf("/")));
if(!directory.exists()){
directory.mkdirs();
}
File sourceFile = new File(originFileName);
File file = new File(fileName);
if(!file.exists()){
file.createNewFile();
}
fis = new FileInputStream(sourceFile);
fos = new FileOutputStream(file);
//复制文件
byte[] bytes = new byte[1024];
while (fis.read(bytes) != -1){
fos.write(bytes);
}
fos.flush();
b = true;
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fis != null){fis.close();}
if(fos != null){fos.close();}
} catch (IOException e) {
log.error("上传文件关闭文件流异常:{}",e.getMessage());
}
}
fileModel = new FileModel(); fileModel = new FileModel();
fileModel.setFilePath(fileName); fileModel.setFilePath(fileName);
if (b) { if (b) {
@ -112,7 +162,39 @@ public class FileServiceImpl implements FileService {
fileModel.setCode(OssReturnConfig.ERROR_09); fileModel.setCode(OssReturnConfig.ERROR_09);
} }
} else if(OssReturnConfig.LOCAL.equals(ossConfig.getOssType())){
//创建目录
boolean b = false;
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File download = new File(downloadFile.substring(0, downloadFile.lastIndexOf("/")));
fis = new FileInputStream(download);
fos = new FileOutputStream(file);
//复制文件
byte[] bytes = new byte[1024];
while (fis.read(bytes) != -1){
fos.write(bytes);
}
fos.flush();
b = true;
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fis != null){fis.close();}
if(fos != null){fos.close();}
} catch (IOException e) {
log.error("上传文件关闭文件流异常:{}",e.getMessage());
}
}
fileModel = new FileModel();
fileModel.setFilePath(saveFile);
if (b) {
fileModel.setCode(OssReturnConfig.SUCCESS);
} else {
fileModel.setCode(OssReturnConfig.ERROR_09);
}
} else { } else {
fileModel = new FileModel(); fileModel = new FileModel();
fileModel.setCode(OssReturnConfig.ERROR_09); fileModel.setCode(OssReturnConfig.ERROR_09);
@ -162,6 +244,16 @@ public class FileServiceImpl implements FileService {
fileModel = new FileModel(); fileModel = new FileModel();
fileModel.setCode(OssReturnConfig.ERROR_01); fileModel.setCode(OssReturnConfig.ERROR_01);
} }
} else if(OssReturnConfig.LOCAL.equals(ossConfig.getOssType())){
File file = new File(path);
boolean b = file.delete();
if (b) {
fileModel = new FileModel();
fileModel.setCode(OssReturnConfig.SUCCESS);
} else {
fileModel = new FileModel();
fileModel.setCode(OssReturnConfig.ERROR_01);
}
}else{ }else{
fileModel = new FileModel(); fileModel = new FileModel();
fileModel.setCode(OssReturnConfig.ERROR_09); fileModel.setCode(OssReturnConfig.ERROR_09);

@ -1,9 +1,5 @@
package com.dxhy.oss.utils; package com.dxhy.oss.utils;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -13,12 +9,12 @@ import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.commons.pool2.impl.DefaultPooledObject;
import java.util.Properties; import java.io.IOException;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Slf4j @Slf4j
public class SftpFactory extends BasePooledObjectFactory<ChannelSftp> { public class SftpFactory extends BasePooledObjectFactory<FTPClient> {
private SftpProperties ossConfig; private SftpProperties ossConfig;
@ -27,37 +23,7 @@ public class SftpFactory extends BasePooledObjectFactory<ChannelSftp> {
} }
@Override @Override
public ChannelSftp create() throws SftpPoolException { public FTPClient create() throws Exception{
try {
JSch jsch = new JSch();
Session session = jsch.getSession(ossConfig.getUsername(), ossConfig.getHostname(), Integer.parseInt(ossConfig.getPort()));
// 设置密码
if (ossConfig.getPassword() != null) {
session.setPassword(ossConfig.getPassword());
}
// 设置密码
if (ossConfig.getPassword() != null) {
session.setPassword(ossConfig.getPassword());
}
// 为Session对象设置properties
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 设置超时时间
session.setTimeout(Integer.parseInt(ossConfig.getTimeout()));
// 建立链接
session.connect();
// 打开SFTP通道
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
// 建立SFTP通道的连接
channel.connect();
return channel;
} catch (JSchException e) {
throw new SftpPoolException("获取ftp连接失败", e);
}
}
public FTPClient createFtp() throws SftpPoolException{
FTPClient ftpClient = null; FTPClient ftpClient = null;
try { try {
ftpClient = new FTPClient(); ftpClient = new FTPClient();
@ -81,16 +47,21 @@ public class SftpFactory extends BasePooledObjectFactory<ChannelSftp> {
return ftpClient; return ftpClient;
} }
@Override @Override
public PooledObject<ChannelSftp> wrap(ChannelSftp channelSftp) { public PooledObject<FTPClient> wrap(FTPClient channelSftp) {
return new DefaultPooledObject<>(channelSftp); return new DefaultPooledObject<>(channelSftp);
} }
// 销毁对象 // 销毁对象
@Override @Override
public void destroyObject(PooledObject<ChannelSftp> p) { public void destroyObject(PooledObject<FTPClient> p) {
ChannelSftp channelSftp = p.getObject(); FTPClient ftpClient = p.getObject();
channelSftp.disconnect(); try {
ftpClient.disconnect();
} catch (IOException e) {
log.error("登出ftp失败,请检查FTP相关配置信息是否正确!" + e);
}
} }
} }

@ -1,13 +1,13 @@
package com.dxhy.oss.utils; package com.dxhy.oss.utils;
import com.jcraft.jsch.ChannelSftp;
import lombok.Data; import lombok.Data;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPool;
@Data @Data
public class SftpPool { public class SftpPool {
private GenericObjectPool<ChannelSftp> pool; private GenericObjectPool<FTPClient> pool;
public SftpPool(SftpFactory factory) { public SftpPool(SftpFactory factory) {
this.pool = new GenericObjectPool<>(factory, factory.getOssConfig().getPool()); this.pool = new GenericObjectPool<>(factory, factory.getOssConfig().getPool());
@ -18,7 +18,7 @@ public class SftpPool {
* *
* @return sftp连接对象 * @return sftp连接对象
*/ */
public ChannelSftp borrowObject() throws SftpPoolException { public FTPClient borrowObject() throws SftpPoolException {
try { try {
return pool.borrowObject(); return pool.borrowObject();
} catch (Exception e) { } catch (Exception e) {
@ -30,11 +30,11 @@ public class SftpPool {
/** /**
* 归还一个sftp连接对象 * 归还一个sftp连接对象
* *
* @param channelSftp sftp连接对象 * @param ftpClient sftp连接对象
*/ */
public void returnObject(ChannelSftp channelSftp) { public void returnObject(FTPClient ftpClient) {
if (channelSftp != null) { if (ftpClient != null) {
pool.returnObject(channelSftp); pool.returnObject(ftpClient);
} }
} }

@ -2,6 +2,7 @@ package com.dxhy.oss.utils;
import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.ChannelSftp;
import lombok.Data; import lombok.Data;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
@ -10,13 +11,13 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
public class SftpProperties { public class SftpProperties {
private String hostname; private String hostname;
private String port = "22"; private String port;
private String username; private String username;
private String password; private String password;
private String timeout; private String timeout;
private Pool pool = new Pool(); private Pool pool = new Pool();
public static class Pool extends GenericObjectPoolConfig<ChannelSftp> { public static class Pool extends GenericObjectPoolConfig<FTPClient> {
private int maxTotal = DEFAULT_MAX_TOTAL; private int maxTotal = DEFAULT_MAX_TOTAL;
private int maxIdle = DEFAULT_MAX_IDLE; private int maxIdle = DEFAULT_MAX_IDLE;

Loading…
Cancel
Save