diff --git a/dxhy-oss/src/main/java/com/dxhy/oss/config/OssReturnConfig.java b/dxhy-oss/src/main/java/com/dxhy/oss/config/OssReturnConfig.java index 2ca3c1d5..22140e07 100644 --- a/dxhy-oss/src/main/java/com/dxhy/oss/config/OssReturnConfig.java +++ b/dxhy-oss/src/main/java/com/dxhy/oss/config/OssReturnConfig.java @@ -17,6 +17,8 @@ public interface OssReturnConfig { String FTP = "FTP"; + String LOCAL = "LOCAL"; + String TOS = "TOS"; String MINIO = "MINIO"; diff --git a/dxhy-oss/src/main/java/com/dxhy/oss/service/FtpService.java b/dxhy-oss/src/main/java/com/dxhy/oss/service/FtpService.java index c82fe0fb..300ffd34 100644 --- a/dxhy-oss/src/main/java/com/dxhy/oss/service/FtpService.java +++ b/dxhy-oss/src/main/java/com/dxhy/oss/service/FtpService.java @@ -1,25 +1,16 @@ package com.dxhy.oss.service; -import cn.hutool.core.io.FileUtil; import com.dxhy.oss.utils.SftpPool; -import com.jcraft.jsch.ChannelSftp; -import com.jcraft.jsch.SftpException; +import com.dxhy.oss.utils.SftpPoolException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; +import java.io.*; import java.util.ArrayList; import java.util.List; -/** - * @author jiaohongyang - */ @Slf4j public class FtpService { @@ -30,67 +21,21 @@ public class FtpService { } /** - * 将输入流的数据上传到sftp作为文件。文件完整路径 = basePath+directory + * ftp上传文件 * - * @param pathName ftp服务保存地址,完整路径 - * @param fileName 上传到ftp的文件名 - * @param originFileName 待上传文件的名称(绝对地址) + * @param serviceDec + * @param fileName + * @param localDec 本地目录 + * @return */ - - public boolean uploadFile(String pathName, String fileName, String originFileName) throws InterruptedException { - log.info("开始上传文件"); - ChannelSftp sftp = null; - 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) { + public boolean uploadFile( String serviceDec, String fileName, String localDec) throws InterruptedException { + FTPClient ftpClient = null; + InputStream inputStream = null; + boolean result =true; try { + inputStream = new FileInputStream(new File(localDec)); log.info("开始上传文件"); + ftpClient = pool.borrowObject(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); createDirecroty(ftpClient, serviceDec); ftpClient.makeDirectory(serviceDec); @@ -100,7 +45,9 @@ public class FtpService { ftpClient.logout(); log.info("上传文件成功"); } catch (Exception e) { + e.printStackTrace(); log.error("上传文件失败" + e); + result =false; } finally { try { if (ftpClient.isConnected()) { @@ -111,10 +58,26 @@ public class FtpService { } } catch (IOException e) { log.error("上传文件失败" + e); - return false; + 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; + } finally { + if (ftpClient != null) { + log.info("回收线程"); + pool.returnObject(ftpClient); } } - return true; } private static boolean createDirecroty(FTPClient ftpClient, String remote) throws IOException { @@ -232,20 +195,41 @@ public class FtpService { } return list; } - public File downloadFile(FTPClient ftpClient, String servicePath, String fileName, String localFilePath) { - String name = dowFile(ftpClient, servicePath, fileName, localFilePath); - if (name != null && !name.equals("")){ - return new File(fileName); + /** + * @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); + if (name != null && !name.equals("")){ + return true; + } + } catch (SftpPoolException e) { + e.printStackTrace(); } - return null; + return false; } + /** + * + * @param ftpClient + * @param servicePath ftp的路径 + * @param fileName 文件名称 + * @param localFilePath 下载到本地的文件夹 + * @return + */ private static String dowFile(FTPClient ftpClient, String servicePath, String fileName, String localFilePath) { InputStream is = null; FileOutputStream fos = null; try { ftpClient.enterLocalPassiveMode(); is = ftpClient.retrieveFileStream(servicePath + fileName);// 获取ftp上的文件 + directoryIsExists(localFilePath); fos = new FileOutputStream(new File(localFilePath + fileName)); // 文件读取方式一 int i; @@ -253,16 +237,14 @@ public class FtpService { while ((i = is.read(bytes)) != -1) { fos.write(bytes, 0, i); } - // 文件读取方式二 - //ftpClient.retrieveFile(ftpFilePath, new FileOutputStream(new File(localFilePath))); ftpClient.completePendingCommand(); log.info("FTP文件下载成功!"); } catch (Exception e) { log.error("FTP文件下载失败!" + e); } finally { try { - if (fos != null) fos.close(); - if (is != null) is.close(); + if (fos != null) {fos.close();} + if (is != null) {is.close();} } catch (IOException e) { log.error("下载流关闭失败" + e); return null; @@ -271,68 +253,8 @@ public class FtpService { 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); if (directory.exists()) { return; diff --git a/dxhy-oss/src/main/java/com/dxhy/oss/service/impl/FileServiceImpl.java b/dxhy-oss/src/main/java/com/dxhy/oss/service/impl/FileServiceImpl.java index ad62dea6..8f948867 100644 --- a/dxhy-oss/src/main/java/com/dxhy/oss/service/impl/FileServiceImpl.java +++ b/dxhy-oss/src/main/java/com/dxhy/oss/service/impl/FileServiceImpl.java @@ -13,6 +13,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; /** * @author jiaohongyang @@ -42,7 +45,7 @@ public class FileServiceImpl implements FileService { * @throws Exception 异常 */ @Override - public FileModel uploadFile(String fileName, String originFileName) throws Exception { + public FileModel uploadFile(String fileName, String originFileName) { log.info("上传文件地址:{} , 本地存储文件地址:{}", fileName, originFileName); FileModel fileModel; if (OssReturnConfig.AL.equals(ossConfig.getOssType())) { @@ -64,7 +67,54 @@ public class FileServiceImpl implements FileService { String directory = fileName.substring(0, fileName.lastIndexOf("/")); File directoryFile = new File(fileName); 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.setFilePath(fileName); if (b) { @@ -112,7 +162,39 @@ public class FileServiceImpl implements FileService { 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 { fileModel = new FileModel(); fileModel.setCode(OssReturnConfig.ERROR_09); @@ -162,7 +244,17 @@ public class FileServiceImpl implements FileService { fileModel = new FileModel(); fileModel.setCode(OssReturnConfig.ERROR_01); } - } else { + } 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{ fileModel = new FileModel(); fileModel.setCode(OssReturnConfig.ERROR_09); } diff --git a/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpFactory.java b/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpFactory.java index 8695b5d6..d694dc7a 100644 --- a/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpFactory.java +++ b/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpFactory.java @@ -1,9 +1,5 @@ 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.EqualsAndHashCode; 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.impl.DefaultPooledObject; -import java.util.Properties; +import java.io.IOException; @EqualsAndHashCode(callSuper = true) @Data @Slf4j -public class SftpFactory extends BasePooledObjectFactory { +public class SftpFactory extends BasePooledObjectFactory { private SftpProperties ossConfig; @@ -27,37 +23,7 @@ public class SftpFactory extends BasePooledObjectFactory { } @Override - public ChannelSftp create() throws SftpPoolException { - 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{ + public FTPClient create() throws Exception{ FTPClient ftpClient = null; try { ftpClient = new FTPClient(); @@ -81,16 +47,21 @@ public class SftpFactory extends BasePooledObjectFactory { return ftpClient; } + @Override - public PooledObject wrap(ChannelSftp channelSftp) { + public PooledObject wrap(FTPClient channelSftp) { return new DefaultPooledObject<>(channelSftp); } // 销毁对象 @Override - public void destroyObject(PooledObject p) { - ChannelSftp channelSftp = p.getObject(); - channelSftp.disconnect(); + public void destroyObject(PooledObject p) { + FTPClient ftpClient = p.getObject(); + try { + ftpClient.disconnect(); + } catch (IOException e) { + log.error("登出ftp失败,请检查FTP相关配置信息是否正确!" + e); + } } } \ No newline at end of file diff --git a/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpPool.java b/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpPool.java index f14f3442..32f7e948 100644 --- a/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpPool.java +++ b/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpPool.java @@ -1,13 +1,13 @@ package com.dxhy.oss.utils; -import com.jcraft.jsch.ChannelSftp; import lombok.Data; +import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.pool2.impl.GenericObjectPool; @Data public class SftpPool { - private GenericObjectPool pool; + private GenericObjectPool pool; public SftpPool(SftpFactory factory) { this.pool = new GenericObjectPool<>(factory, factory.getOssConfig().getPool()); @@ -18,7 +18,7 @@ public class SftpPool { * * @return sftp连接对象 */ - public ChannelSftp borrowObject() throws SftpPoolException { + public FTPClient borrowObject() throws SftpPoolException { try { return pool.borrowObject(); } catch (Exception e) { @@ -30,11 +30,11 @@ public class SftpPool { /** * 归还一个sftp连接对象 * - * @param channelSftp sftp连接对象 + * @param ftpClient sftp连接对象 */ - public void returnObject(ChannelSftp channelSftp) { - if (channelSftp != null) { - pool.returnObject(channelSftp); + public void returnObject(FTPClient ftpClient) { + if (ftpClient != null) { + pool.returnObject(ftpClient); } } diff --git a/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpProperties.java b/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpProperties.java index 3ad51d4a..912e9296 100644 --- a/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpProperties.java +++ b/dxhy-oss/src/main/java/com/dxhy/oss/utils/SftpProperties.java @@ -2,6 +2,7 @@ package com.dxhy.oss.utils; import com.jcraft.jsch.ChannelSftp; import lombok.Data; +import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -10,13 +11,13 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class SftpProperties { private String hostname; - private String port = "22"; + private String port; private String username; private String password; private String timeout; private Pool pool = new Pool(); - public static class Pool extends GenericObjectPoolConfig { + public static class Pool extends GenericObjectPoolConfig { private int maxTotal = DEFAULT_MAX_TOTAL; private int maxIdle = DEFAULT_MAX_IDLE;