zoukankan      html  css  js  c++  java
  • MyFtpClient 1.8下的ftp工具类

    public class MyFtpClient {

    private static Logger logger = LoggerFactory.getLogger(MyFtpClient.class);
    
    public FTPClient ftp = null;
    
    private String ip = "";
    
    private int port = 21;
    
    private String username = "";
    
    private String password = "";
    
    public MyFtpClient() {
    	ftp = new FTPClient();
    }
    
    
    /**   
    * @Function: MyFtpClient.java
    * @Description: 该函数的功能描述
    * @param:参数描述
    */
    public MyFtpClient(String ip, String username, String password) {
    	super();
    	this.ip = ip;
    	this.username = username;
    	this.password = password;
    	
    	try {
    		connect();
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    
    
    public boolean uploadFile(String serverpath, String file) {
    	// 初始表示上传失败
    	boolean success = false;
    	// 创建FTPClient对象
    	try {
    		// 设置PassiveMode传输
    		if (!ftp.isConnected()) {
    			boolean b = connect();
    			if (b == false) {
    				return success;
    			}
    		}
    		/*
    		 * int reply; reply = ftp.getReplyCode(); if
    		 * (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return success; }
    		 */
    		// 转到指定上传目录
    		serverpath = gbkToIso8859(serverpath);
    		if (!checkPathExist(iso8859ToGbk(serverpath)))
    			return false;
    		if (!ftp.changeWorkingDirectory(iso8859ToGbk(serverpath))) {
    			System.err.print("远程无此目录");
    			return false;
    		}
    
    		// 输入流
    		InputStream input = null;
    		try {
    			file = gbkToIso8859(file);
    			input = new FileInputStream(iso8859ToGbk(file));
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    		// 将上传文件存储到指定目录
    		file = iso8859ToGbk(file);
    		if (!ftp.storeFile(iso8859ToGbk(serverpath) + "/" + iso8859ToGbk(getFilename(file)), input)) {
    			return false;
    		}
    
    		// 关闭输入流
    		input.close();
    		// 退出ftp
    
    		// 表示上传成功
    		success = true;
    	} catch (IOException e) {
    		e.printStackTrace();
    	} finally {
    		try {
    			ftp.logout();
    			disconnect();
    		} catch (IOException ioe) {
    		}
    
    	}
    	return success;
    }
    
    /**
     * 从FTP服务器下载文件
     * 
     * @param ip
     *            FTP服务器ip e.g:
     * @param port
     *            FTP服务器端口
     * @param username
     *            FTP登录账号
     * @param password
     *            FTP登录密码
     * @param serverpath
     *            FTP服务器上的相对路径 默认缺省时指向主目录
     * @param fileName
     *            要下载的文件名
     * @param localPath
     *            下载后保存到本地的路径 不含文件名
     * @return 成功返回true,否则返回false
     */
    public String downFile(String serverpath, String fileName, String localPath) { // 初始表示下载失败
    	String msg = ProductErrorEnum.Pro_FileDownload_Defeat_Tip.getCode();
    	// 创建FTPClient对象
    	try {
    		if (!ftp.isConnected()) {
    			boolean b = connect();
    			if (b == false) {
    				return msg;
    			}
    			logger.info("服务器已连接");
    		}
    		/*
    		 * int reply; reply = ftp.getReplyCode(); if
    		 * (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return success; }
    		 */
    
    		// 转到指定下载目录
    		logger.info("文件路径是"+serverpath);
    		serverpath = gbkToIso8859(serverpath);
    		//logger.info("转码后路径是"+serverpath);
    		ftp.changeWorkingDirectory(this.iso8859ToGbk(serverpath));
    		// 列出该目录下所有文件
    		FTPFile[] fs = ftp.listFiles();
    		fileName = this.gbkToIso8859(fileName);
    		localPath = this.gbkToIso8859(localPath);
    
    		// 遍历所有文件,找到指定的文件
    
    		for (int i = 0; i < fs.length; i++) {
    			FTPFile f = fs[i];
    
    			logger.info("文件服务器上的文件是"+f);
    			logger.info("要下载文件名(库里查询)转码前名字是"+fileName);
    			if (f.getName().equals(iso8859ToGbk(fileName))) {
    				logger.info("iso8859ToGbk要下载文件名(库里查询)转码后名字在文件服务器上找到了");
    				// 根据绝对路径初始化文件
    				File localFile = new File(iso8859ToGbk(localPath) + File.separator + f.getName());
    				File localFileDir = new File(iso8859ToGbk(localPath));
    				// 保存路径不存在时创建
    				if (!localFileDir.exists()) {
    					localFileDir.mkdirs();
    				}
    				// 输出流
    				OutputStream is = new FileOutputStream(localFile);
    				// 下载文件
    				//ftp.retrieveFile(f.getName(), is);
    				
    				String propertyForPlatform2="";
    				String propertyForPlatform1="";
    				try {
    					propertyForPlatform1 = SysConfig.getPropertyForPlatform("Persionalencoding1");
    					propertyForPlatform2 = SysConfig.getPropertyForPlatform("Persionalencoding2");
    				} catch (Exception e) {
    					propertyForPlatform1="GBK";
    					propertyForPlatform2="ISO-8859-1";
    					e.printStackTrace();
    				}
    				ftp.retrieveFile(new String(f.getName().getBytes(propertyForPlatform1), propertyForPlatform2), is);
    				is.close();
    				// 下载成功
    				msg = ProductErrorEnum.Pro_FileDownload_Success_Tip.getCode();
    				logger.info("文件下载成功"+msg);
    			}
    			
    		}
    	} catch (IOException e) {
    		e.printStackTrace();
    	} finally {
    		try {
    			ftp.logout();
    			disconnect();
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		}
    	}
    	return msg;
    }
    
    
    public String downFileUTF8(String serverpath, String fileName, String localPath) { // 初始表示下载失败
    	String msg = ProductErrorEnum.Pro_FileDownload_Defeat_Tip.getCode();
    	// 创建FTPClient对象
    	try {
    		if (!ftp.isConnected()) {
    			boolean b = connectUtf8();
    			if (b == false) {
    				return msg;
    			}
    			logger.info("服务器已连接");
    		}
    		/*
    		 * int reply; reply = ftp.getReplyCode(); if
    		 * (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return success; }
    		 */
    
    		// 转到指定下载目录
    		logger.info("文件路径是"+serverpath);
    		serverpath = Utf8ToIso8859(serverpath);
    		//logger.info("转码后路径是"+serverpath);
    		ftp.changeWorkingDirectory(this.iso8859ToUtf8(serverpath));
    		// 列出该目录下所有文件
    		FTPFile[] fs = ftp.listFiles();
    		fileName = this.Utf8ToIso8859(fileName);
    		localPath = this.Utf8ToIso8859(localPath);
    
    		// 遍历所有文件,找到指定的文件
    
    		for (int i = 0; i < fs.length; i++) {
    			FTPFile f = fs[i];
    
    			logger.info("文件服务器上的文件是"+f);
    			logger.info("要下载文件名(库里查询)转码前名字是"+fileName);
    			logger.info("要下载文件名(库里查询)转码后名字iso8859ToUtf8是"+fileName);
    			if (f.getName().equals(iso8859ToUtf8(fileName))) {
    				logger.info("iso8859ToUtf8要下载文件名(库里查询)转码后名字在文件服务器上找到了");
    				// 根据绝对路径初始化文件
    				File localFile = new File(iso8859ToUtf8(localPath) + File.separator + f.getName());
    				File localFileDir = new File(iso8859ToUtf8(localPath));
    				// 保存路径不存在时创建
    				if (!localFileDir.exists()) {
    					localFileDir.mkdirs();
    				}
    				// 输出流
    				OutputStream is = new FileOutputStream(localFile);
    				// 下载文件
    				ftp.retrieveFile(f.getName(), is);
    				is.close();
    				// 下载成功
    				msg = ProductErrorEnum.Pro_FileDownload_Success_Tip.getCode();
    				logger.info("文件下载成功"+msg);
    			}
    			
    		}
    	} catch (IOException e) {
    		e.printStackTrace();
    	} finally {
    		try {
    			ftp.logout();
    			disconnect();
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		}
    	}
    	return msg;
    }
    
    /**
     * 
     * 查找指定目录是否存在 不存在创建目录
     * 
     * @param FTPClient
     *            ftpClient 要检查的FTP服务器
     * @param String
     *            filePath 要查找的目录
     * @return boolean:存在:true,不存在:false
     * @throws IOException
     */
    private boolean checkPathExist(String filePath) throws IOException {
    	boolean existFlag = false;
    	try {
    		if (filePath != null && !filePath.equals("")) {
    			if (filePath.indexOf("/") != -1) {
    				int index = 0;
    				while ((index = filePath.indexOf("/")) != -1) {
    					if (!ftp.changeWorkingDirectory(filePath.substring(0, index))) {
    						ftp.makeDirectory(filePath.substring(0, index));
    					}
    					ftp.changeWorkingDirectory(filePath.substring(0, index));
    					filePath = filePath.substring(index + 1, filePath.length());
    				}
    				if (!filePath.equals("")) {
    					if (!ftp.changeWorkingDirectory(filePath)) {
    						ftp.makeDirectory(filePath);
    					}
    				}
    			}
    			existFlag = true;
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	return existFlag;
    }
    
    /**
     * 根据绝对路径获得文件名
     * 
     * @param file
     *            文件绝对路径 e.g: e.g: E:/log/log.txt OR E:\log\log.txt
     * @return 转码后的文件名
     */
    private String getFilename(String file) {
    	// 文件名
    	String filename = "";
    	if (file != null && !file.equals("")) {
    		file = file.replaceAll(Matcher.quoteReplacement("\"), "/");
    		String[] strs = file.split("/");
    		filename = strs[strs.length - 1];
    	}
    	filename = gbkToIso8859(filename);// 转码
    	return filename;
    }
    
    
    /**
     * 转码[ISO-8859-1 -> GBK] 不同的平台需要不同的转码
     * 
     * @param obj
     * @return
     */
    private String iso8859ToGbk(Object obj) {
    	try {
    		if (obj == null)
    			return "";
    		else {
    			String str = new String(obj.toString().getBytes("iso-8859-1"), "GBK");
    			return str;
    
    		}
    	} catch (Exception e) {
    		return "";
    	}
    }
    
    /**
     * 转码[GBK -> ISO-8859-1] 不同的平台需要不同的转码
     * 
     * @param obj
     * @return
     */
    private String gbkToIso8859(Object obj) {
    	try {
    		if (obj == null)
    			return "";
    		else
    			return new String(obj.toString().getBytes("GBK"), "iso-8859-1");
    	} catch (Exception e) {
    		return "";
    	}
    }
    
    /**
     * 转码[ISO-8859-1 -> UTF-8] 不同的平台需要不同的转码
     * 
     * @param obj
     * @return
     */
    private String iso8859ToUtf8(Object obj) {
    	try {
    		if (obj == null)
    			return "";
    		else {
    			String str = new String(obj.toString().getBytes("iso-8859-1"), "UTF-8");
    			return str;
    
    		}
    	} catch (Exception e) {
    		return "";
    	}
    }
    
    /**
     * 转码[UTF-8 -> ISO-8859-1] 不同的平台需要不同的转码
     * 
     * @param obj
     * @return
     */
    private String Utf8ToIso8859(Object obj) {
    	try {
    		if (obj == null)
    			return "";
    		else
    			return new String(obj.toString().getBytes("UTF-8"), "iso-8859-1");
    	} catch (Exception e) {
    		return "";
    	}
    }
    
    /** */
    /**
     * 连接到FTP服务器
     * 
     * @param hostname
     *            主机名
     * @param port
     *            端口
     * @param username
     *            用户名
     * @param password
     *            密码
     * @return 是否连接成功
     * @throws IOException
     */
    private boolean connect(String hostname, int port, String username, String password) throws IOException {
    	
    	ftp.setControlEncoding("GBK");
    	//UTF-8  GBK
    	FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
    	//SYST_UNIX  SYST_NT
    	conf.setServerLanguageCode("zh");
    	ftp.connect(hostname, port);
    	int reply = ftp.getReplyCode();
    	if (FTPReply.isPositiveCompletion(reply)) {
    		if (ftp.login(username, password)) {
    			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
    			ftp.enterLocalPassiveMode();
    
    			return true;
    		}
    	}
    	disconnect();
    	return false;
    }
    
    public boolean connect() throws IOException {
    	return connect(ip, port, username, password);
    }
    

    private boolean connectUtf8(String hostname, int port, String username, String password) throws IOException {

    	ftp.setControlEncoding("UTF-8");
    	//UTF-8  GBK
    	FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
    	//SYST_UNIX  SYST_NT
    	conf.setServerLanguageCode("zh");
    	ftp.connect(hostname, port);
    	int reply = ftp.getReplyCode();
    	if (FTPReply.isPositiveCompletion(reply)) {
    		if (ftp.login(username, password)) {
    			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
    			ftp.enterLocalPassiveMode();
    
    			return true;
    		}
    	}
    	disconnect();
    	return false;
    }
    
    public boolean connectUtf8() throws IOException {
    	return connectUtf8(ip, port, username, password);
    }
    
    /**
     * 断开与远程服务器的连接
     * 
     * @throws IOException
     */
    public void disconnect() throws IOException {
    	if (ftp.isConnected()) {
    		ftp.disconnect();
    	}
    }
    
    public void setFtp(FTPClient ftp) {
    	this.ftp = ftp;
    }
    
    public void setIp(String ip) {
    	this.ip = ip;
    }
    
    public void setPassword(String password) {
    	this.password = password;
    }
    
    public void setPort(int port) {
    	this.port = port;
    }
    
    public void setUsername(String username) {
    	this.username = username;
    }
    
    
    public static void main(String[] args) {
    	MyFtpClient ftpClient = new MyFtpClient();
    	ftpClient.setIp("10.8.206.1");
    	ftpClient.setUsername("ftpuser");
    	ftpClient.setPassword("123");
    
    	String fileName="附件2020.doc";
    	String serverpath="/weblogic/ftp/202010";
    	String localPath="out";
    	String downFile = ftpClient.downFile(serverpath, fileName, localPath);
    	logger.info("输出结果是"+downFile);
    }
    

    }

  • 相关阅读:
    Log4Net的WinForm使用
    Log4Net的控制台,WinForm,WebApplication使用
    C# 正则表达式判断IP,URL等及其解释
    C++:默认的构造函数
    C++:对象声明
    C++:对象的初始化和构造函数
    C++:类的成员函数定义方式
    C++:类的创建
    C++:this指针
    C++:String类
  • 原文地址:https://www.cnblogs.com/jianzhixuan/p/13878764.html
Copyright © 2011-2022 走看看