Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/FtpFileManagerImpl.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/FtpFileManagerImpl.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/FtpFileManagerImpl.java (revision 26627) @@ -0,0 +1,270 @@ +package com.forgon.disinfectsystem.filemanager; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.SocketException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; +import org.apache.commons.net.ftp.FTPFileFilter; +import org.apache.commons.net.ftp.FTPReply; + +import com.forgon.util.StringUtil; + +public class FtpFileManagerImpl implements FtpFileManager{ + + @Override + public FTPFile getFileByFileName(String fileName, String targetRoute, + FTPClient ftp) throws IOException { + FTPFile file = null; + try { + FTPFileFilter filter = new FTPFileFilter() { + @Override + public boolean accept(FTPFile file) { + try { + if(new String(file.getName().getBytes("UTF-8"),"iso-8859-1").equals(fileName)){ + return true; + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return false; + } + }; + FTPFile[] list = ftp.listFiles(targetRoute, filter); + if(list != null && list.length > 0){ + file = ftp.listFiles(targetRoute, filter)[0]; + } + } catch (Exception e) { + throw new IOException("获取文件"+ fileName +"失败"); + } + return file; + } + + + @Override + public FTPFile copyFile(String fileName, FTPClient ftp, String sourceRoute, String targetRoute, boolean isReturnNewFile) throws IOException{ + FTPFile file = null; + ByteArrayOutputStream out = null; + InputStream in = null; + try { + if(StringUtil.isContainChinese(targetRoute)){ + targetRoute = new String(targetRoute.getBytes("UTF-8"),"iso-8859-1"); + } + if(StringUtil.isContainChinese(fileName)){ + fileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1"); + } + // 跳转到文件目录 + changeWorkingDirectory(ftp, sourceRoute); + out = new ByteArrayOutputStream(); + in = getInputStream(ftp, fileName, out); + makeDirectory(ftp, targetRoute); + boolean flag = storeFile(ftp, targetRoute + File.separator + fileName, in); + //boolean flag = ftp.storeFile(targetRoute + File.separator + fileName,in); + out.flush(); + if(!flag){ + throw new IOException("复制文件"+ fileName +"失败"); + } + if(isReturnNewFile){ + try { + file = getFileByFileName(fileName, targetRoute, ftp); + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + } catch (IOException e) { + throw new IOException("从"+ new String(sourceRoute.getBytes("iso-8859-1"),"UTF-8") +"复制文件"+ fileName +"发生异常"); + }finally{ + if(out != null){ + out.close(); + } + if(in != null){ + in.close(); + } + } + return file; + } + @Override + public boolean moveFile(String fileName, FTPClient ftp, String sourceRoute, String targetRoute){ + boolean moveResult = false; + try { + changeWorkingDirectory(ftp, sourceRoute); + //新文件夹不存在则创建 + if(!changeWorkingDirectory(ftp, targetRoute)){ + makeDirectory(ftp, targetRoute); + } + //回到原有工作目录 + changeWorkingDirectory(ftp,sourceRoute); + //转存目录 + if(StringUtil.isContainChinese(targetRoute)){ + targetRoute = new String(targetRoute.getBytes("UTF-8"),"iso-8859-1"); + } + moveResult = ftp.rename(new String(fileName.getBytes("UTF-8"),"ISO-8859-1"), targetRoute + File.separator + new String(fileName.getBytes("UTF-8"),"ISO-8859-1")); + if(!moveResult){ + throw new RuntimeException("移动文件"+ fileName +"失败"); + } + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + return moveResult; + } + @Override + public String getCurrentPath(FTPClient ftp) throws IOException{ + String path = null; + try { + if(ftp != null){ + String[] rt = ftp.doCommandAsStrings("pwd",""); + Pattern p = Pattern.compile("\"(.*?)\""); + Matcher m = p.matcher(rt[0]); + if(m.find()){ + path = m.group(0).replace("\"",""); + } + } + } catch (Exception e) { + throw new IOException("获取当前绝对路径失败"); + } + return path; + } + @Override + public FTPFile[] getListFiles(FTPClient ftp, String path, FTPFileFilter filter){ + FTPFile[] files = null; + try { + files = ftp.listFiles(path,filter); + } catch (IOException e2) { + e2.printStackTrace(); + if(StringUtils.isBlank(path)){ + try { + throw new RuntimeException("查看"+ getCurrentPath(ftp) +"目录下的文件异常"); + } catch (IOException e) { + throw new RuntimeException(e.getMessage()); + } + }else{ + throw new RuntimeException("查看"+ path +"目录下的文件异常"); + } + } + return files; + } + @Override + public InputStream getInputStream(FTPClient ftp, String fileName, ByteArrayOutputStream fos){ + InputStream inputStream = null; + try { + fos = new ByteArrayOutputStream(); + //读取文件,使用下载文件的方法把文件写入内存,绑定到out流上 + ftp.retrieveFile(new String(fileName.getBytes("UTF-8"),"ISO-8859-1"), fos); + inputStream = new ByteArrayInputStream(fos.toByteArray()); + } catch (Exception e) { + throw new RuntimeException("获取inputStream异常"); + } + return inputStream; + } + @Override + public boolean changeWorkingDirectory(FTPClient ftp, String path){ + boolean flag = false; + try { + if(StringUtil.isContainChinese(path)){ + path = new String(path.getBytes("UTF-8"),"iso-8859-1"); + } + flag = ftp.changeWorkingDirectory(path); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("切换目录[" + path + "]失败"); + } + return flag; + } + @Override + public void makeDirectory(FTPClient ftp , String path){ + try { + if(StringUtil.isContainChinese(path)){ + path = new String(path.getBytes("UTF-8"),"iso-8859-1"); + } + ftp.makeDirectory(path); + } catch (Exception e) { + throw new RuntimeException("创建文件异常,path:" + path); + } + } + /** + * FTP连接远程 + * @param ip + * @param port + * @param userName + * @param pwd + */ + @Override + public FTPClient getFTPClient(String ip, Integer port, String userName, String pwd){ + FTPClient ftp = null; + try { + ftp = new FTPClient(); + // 连接FPT服务器,设置IP及端口 + ftp.connect(ip, port); + // 设置用户名和密码 + ftp.login(userName, pwd); + // 设置连接超时时间,5000毫秒 + ftp.setConnectTimeout(50000); + // 设置中文编码集,防止中文乱码 + ftp.setControlEncoding("UTF-8"); + if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { + ftp.disconnect(); + throw new RuntimeException("未连接到FTP,用户名或密码错误"); + } + } catch (SocketException e) { + e.printStackTrace(); + throw new RuntimeException("FTP的IP地址可能错误,请正确配置"); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("FTP的端口错误,请正确配置"); + } catch (RuntimeException e) { + throw new RuntimeException(e.getMessage()); + } + return ftp; + } + @Override + public boolean closeFTP(FTPClient ftp) { + boolean flag = true; + if(ftp != null){ + try { + ftp.logout(); + } catch (Exception e) { + flag = false; + e.printStackTrace(); + }finally{ + if (ftp.isConnected()) { + try { + ftp.disconnect(); + } catch (IOException ioe) { + flag = false; + ioe.printStackTrace(); + } + } + } + } + return flag; + } + /** + * 复制移动文件,处理中文 + * @param ftp + * @param path 目标路径 + * @param in 输入流 + * @return + */ + private boolean storeFile(FTPClient ftp, String path ,InputStream in){ + boolean flag = false; + try { + if(StringUtil.isContainChinese(path)){ + path = new String(path.getBytes("UTF-8"),"iso-8859-1"); + } + flag = ftp.storeFile(path,in); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e){ + e.printStackTrace(); + } + return flag; + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/FtpFileManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/FtpFileManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/FtpFileManager.java (revision 26627) @@ -0,0 +1,87 @@ +package com.forgon.disinfectsystem.filemanager; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; +import org.apache.commons.net.ftp.FTPFileFilter; + +public interface FtpFileManager { + /** + * 获取指定目录下的文件fileName + * @param fileName 文件名 + * @param targetRoute 路径 "":当前目录 + * @param ftp + * @return + * @throws IOException + */ + public FTPFile getFileByFileName(String fileName, String targetRoute, FTPClient ftp) throws IOException; + /** + * 复制文件 + * @param fileName 文件名 + * @param ftpClient + * @param sourceRoute 原路径 + * @param targetRoute 目标路径 + * @param isReturnNewFile 是否返回新的文件 + * @throws IOException + */ + public FTPFile copyFile(String fileName, FTPClient ftpClient, String sourceRoute, String targetRoute, boolean isReturnNewFile) throws IOException; + /** + * 移动文件 + * @param fileName 文件名 + * @param ftp FTPClient + * @param sourceRoute 原路径 + * @param targetRoute 目标路径 + */ + public boolean moveFile(String fileName, FTPClient ftp, String sourceRoute, String targetRoute); + /** + * 获取FTPClient当前绝对路径 + * @param ftp + * @return FTPClient当前绝对路径 + * @throws IOException + */ + public String getCurrentPath(FTPClient ftp) throws IOException; + /** + * 获取path下的文件 + * @param ftp + * @param path 路径 为空或''则获取当前目录下的文件 + * @param filter 过滤器 + * @return FTPFile[] + */ + public FTPFile[] getListFiles(FTPClient ftp, String path, FTPFileFilter filter); + /** + * 获取文件输入流 + * @param ftp FTPClient + * @param fileName 文件名 + * @return + */ + public InputStream getInputStream(FTPClient ftp, String fileName, ByteArrayOutputStream fos); + /** + * FTP转换工作空间 + * @param ftp + * @param path 工作空间相对路径或绝对路径 + * @param isContainChinese 是否包含中文 + */ + public boolean changeWorkingDirectory(FTPClient ftp, String path); + /** + * 创建文件夹 + * @param ftp + * @param path + */ + public void makeDirectory(FTPClient ftp , String path); + /** + * FTP连接远程 + * @param ip + * @param port + * @param userName + * @param pwd + */ + public FTPClient getFTPClient(String ip, Integer port, String userName, String pwd); + /** + * 关闭FTP连接 + * @param ftp + */ + public boolean closeFTP(FTPClient ftp); +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/SmbFileManagerImpl.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/SmbFileManagerImpl.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/SmbFileManagerImpl.java (revision 26627) @@ -0,0 +1,45 @@ +package com.forgon.disinfectsystem.filemanager; + +import java.io.InputStream; + +import jcifs.smb.SmbFile; + +import org.springframework.integration.smb.session.SmbSession; + +public class SmbFileManagerImpl implements SmbFileManager{ + + @Override + public InputStream getInputStream(SmbFile smbFile) { + InputStream inputStream = null; + try { + inputStream = smbFile.getInputStream(); + } catch (Exception e) { + throw new RuntimeException("获取inputStream异常"); + } + return inputStream; + } + /** + * 创建文件夹 + * @param session SmbSession + * @param path + */ + public void makeDirectory(SmbSession session , String path){ + try { + if(session != null && !session.exists(path)){ + session.mkdir(path); + } + } catch (Exception e) { + throw new RuntimeException("创建文件异常,path:" + path); + } + } + public void moveSmbFile(SmbSession session, SmbFile smbForm, String targetRoute){ + try{ + SmbFile desFile = session.createSmbFileObject(targetRoute + "/" + smbForm.getName()); + smbForm.copyTo(desFile); + smbForm.delete(); + }catch(Exception e){ + e.printStackTrace(); + throw new RuntimeException(smbForm.getName()+"文件在移动和删除过程中发生错误"); + } + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/CommonFileManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/CommonFileManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/CommonFileManager.java (revision 26627) @@ -0,0 +1,38 @@ +package com.forgon.disinfectsystem.filemanager; + +import java.io.InputStream; + +import jcifs.smb.SmbFile; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.net.ftp.FTPClient; +import org.springframework.integration.smb.session.SmbSession; + +public interface CommonFileManager { + /** + * 获取文件输入流 + * @param ftp FTPClient + * @param ftpFile FTPFile + * @return + */ + public InputStream getInputStream(String remoteType, FTPClient ftp, String fileName, SmbFile smbFile, ByteArrayOutputStream fos); + /** + * 移动文件 + * @param remoteType 远程方式 + * @param fileName ftp方式参数 文件名 + * @param ftp ftp方式参数 FTPClient + * @param sourceRoute ftp方式参数 原路径 + * @param targetRoute ftp方式参数 目标路径 + * @param session smbfile方式参数 SmbSession + * @param smbForm smbfile方式参数 移动前SmbFile + */ + public void moveFile(String remoteType, String fileName, FTPClient ftp, String sourceRoute, String targetRoute,SmbSession session, SmbFile smbForm); + /** + * 创建文件 + * @param remoteType远程方式 + * @param ftp + * @param path + * @param session + */ + public void makeDirectory(String remoteType, FTPClient ftp , String path, SmbSession session); +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/SmbFileManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/SmbFileManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/SmbFileManager.java (revision 26627) @@ -0,0 +1,30 @@ +package com.forgon.disinfectsystem.filemanager; + +import java.io.InputStream; + +import org.springframework.integration.smb.session.SmbSession; + +import jcifs.smb.SmbFile; + +public interface SmbFileManager { + /** + * 获取文件输入流 + * @param ftp FTPClient + * @param ftpFile FTPFile + * @return + */ + public InputStream getInputStream(SmbFile smbFile); + /** + * 创建文件夹 + * @param session SmbSession + * @param path + */ + public void makeDirectory(SmbSession session , String path); + /** + * smbfile文件移动 + * @param session SmbSession + * @param smbForm 移动前的SmbFile + * @param targetRoute 目标路径 + */ + public void moveSmbFile(SmbSession session, SmbFile smbForm, String targetRoute); +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/CommonFileManagerImpl.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/CommonFileManagerImpl.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/filemanager/CommonFileManagerImpl.java (revision 26627) @@ -0,0 +1,51 @@ +package com.forgon.disinfectsystem.filemanager; + +import java.io.InputStream; + +import jcifs.smb.SmbFile; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.net.ftp.FTPClient; +import org.springframework.integration.smb.session.SmbSession; + +import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; + +public class CommonFileManagerImpl implements CommonFileManager{ + private SmbFileManager smbFileManager; + private FtpFileManager ftpFileManager; + public void setSmbFileManager(SmbFileManager smbFileManager) { + this.smbFileManager = smbFileManager; + } + public void setFtpFileManager(FtpFileManager ftpFileManager) { + this.ftpFileManager = ftpFileManager; + } + @Override + public InputStream getInputStream(String remoteType, FTPClient ftp, String fileName, SmbFile smbFile, ByteArrayOutputStream fos){ + InputStream inputStream = null; + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + inputStream = ftpFileManager.getInputStream(ftp, fileName, fos); + }else if(DeviceInterface.INTERFACETYPE_SHAREFOLDER.equals(remoteType)){ + inputStream = smbFileManager.getInputStream(smbFile); + } + return inputStream; + } + @Override + public void moveFile(String remoteType, String fileName, FTPClient ftp, + String sourceRoute, String targetRoute, SmbSession session, + SmbFile smbForm) { + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + ftpFileManager.moveFile(fileName, ftp, sourceRoute, targetRoute); + }else if(DeviceInterface.INTERFACETYPE_SHAREFOLDER.equals(remoteType)){ + smbFileManager.moveSmbFile(session, smbForm, targetRoute); + } + } + @Override + public void makeDirectory(String remoteType, FTPClient ftp, String path, + SmbSession session) { + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + ftpFileManager.makeDirectory(ftp, path); + }else if(DeviceInterface.INTERFACETYPE_SHAREFOLDER.equals(remoteType)){ + smbFileManager.makeDirectory(session, path); + } + } +}