package com.walker.file.ftp; import com.walker.file.AbstractFileOperateEngine; import com.walker.file.DefaultFileInfo; import com.walker.file.FileInfo; import com.walker.file.FileOperateException; import com.walker.file.FileStoreType; import com.walker.infrastructure.utils.FileUtils; import com.walker.infrastructure.utils.StringUtils; import java.io.InputStream; /** * 基于FTP文件管理的引擎实现。 * @author 时克英 * @date 2023-02-10 */ public abstract class FtpFileOperateEngine extends AbstractFileOperateEngine { @Override public FileStoreType getFileStoreType(){ return FileStoreType.Ftp; } @Override protected FileInfo acquireFileInfo(String fileName) { return new DefaultFileInfo(); } @Override public void close() { super.close(); // if(this.ftpConnector != null){ // this.ftpConnector.logout(); // } } @Override protected void executeUpload(InputStream inputStream, FileInfo fileInfo) throws FileOperateException { FtpConnector ftpConnector = new FtpConnector(this.ftpConfig); try { ftpConnector.connect(); } catch (Exception e) { throw new FileOperateException("Ftp无法连接,上传未执行,fileInfo = " + fileInfo.getFileName(), e); } // if(!this.ftpConnector.isConnected()){ // logger.warn("ftpConnector 当前未连接,尝试重新连接..."); // try { // this.ftpConnector.connect(); // } catch (Exception e) { // throw new FileOperateException("ftpConnector 无法连接,上传失败", e); // } // } // 服务端或远程存放目录,由程序自动生成 String directory = this.generateSaveFolder(true); StringBuilder url = new StringBuilder(directory); url.append(this.getFileName(fileInfo)); ((DefaultFileInfo)fileInfo).setUrl(url.toString()); logger.debug("上传文件生成目录: " + directory); try{ ftpConnector.upload(directory, fileInfo.getFileName(), inputStream); } catch (FtpUploadException ex){ throw ex; } finally { if(ftpConnector != null){ ftpConnector.logout(); } } } @Override protected byte[] executeDownload(FileInfo fileInfo) throws FileOperateException{ if(StringUtils.isEmpty(fileInfo.getUrl())){ throw new FileOperateException("文件url不存在,fileId=" + fileInfo.getId(), null); } String url = fileInfo.getUrl(); String directory = FileUtils.getFilePathWithoutName(url); FtpConnector ftpConnector = new FtpConnector(this.ftpConfig); try { ftpConnector.connect(); } catch (Exception e) { throw new FileOperateException("Ftp无法连接,下载失败,fileInfo = " + fileInfo.getFileName(), e); } try{ return ftpConnector.download(directory, this.getFileName(fileInfo)); } catch (FtpUploadException ex){ throw new FileOperateException("ftp下载文件错误:" + ex.getMessage(), ex); } } /** * 设置ftp信息,并初始化ftp连接器。 * @param ftpConfig * @throws Exception */ public void setFtpConfig(FtpConfig ftpConfig){ if(ftpConfig == null){ throw new IllegalArgumentException("FtpConfig 必须设置!"); } this.ftpConfig = ftpConfig; } private FtpConfig ftpConfig = null; }