package com.gavin.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;


public class FTPUtil {
		/** 
		 * Description: 向FTP服务器上传文件 
		 * @param FTPPath FTP路径
		 * @param filename 上传到FTP服务器上的文件名 
		 * @param input 输入流 
		 * @return 成功返回true,否则返回false 
		 */  
		public static boolean uploadFile(String FTPPath, String filename, InputStream input) {
			boolean result = false;
			FTPClient ftp = new FTPClient();
			try {
				Map<String, Object> infoMap=analyzeFTPPath(FTPPath);
				String username=infoMap.get("userName").toString();
				String password=infoMap.get("password").toString();
			    String host=infoMap.get("url").toString();
				String dir=infoMap.get("dir").toString();
				int port=(Integer)infoMap.get("port");
				int reply;
				ftp.connect(host, port);// 连接FTP服务器
				// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
				ftp.login(username, password);// 登录
				reply = ftp.getReplyCode();
				if (!FTPReply.isPositiveCompletion(reply)) {
					ftp.disconnect();
					System.out.println("无法连接到FTP");
					return result;
				}
				//切换到上传目录
				 if(dir!=""){
		        	 String[] dirArray=dir.split("/");
		        	 for(String path:dirArray){
		        		 ftp.changeWorkingDirectory(path);// 转移到FTP服务器目录  
		        	 }
		        	 
		        }
				//设置上传文件的类型为二进制类型 
				ftp.setFileType(FTP.BINARY_FILE_TYPE);
				ftp.setControlEncoding("UTF-8");
				//上传文件
				if (!ftp.storeFile(new String(filename.getBytes("UTF-8"),"iso-8859-1"), input)) {
					return result;
				}
				input.close();
				ftp.logout();
				result = true;
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (ftp.isConnected()) {
					try {
						ftp.disconnect();
					} catch (IOException ioe) {
						ioe.printStackTrace();
					}
				}
			}
			return result;
		}
		
		/** 
		 * Description: 从FTP服务器下载文件 
		 * @param FTPPath FTP服务器地址
		 * @param fileName 要下载的文件名 
		 * @param localPath 下载后保存到本地的路径 
		 * @return 
		 */  
		public static boolean downloadFile(String FTPPath,
				String fileName, String localPath) {
			boolean result = false;
			FTPClient ftp = new FTPClient();
			try {
				Map<String, Object> infoMap=analyzeFTPPath(FTPPath);
				String username=infoMap.get("userName").toString();
				String password=infoMap.get("password").toString();
			    String host=infoMap.get("url").toString();
				String remotePath=infoMap.get("dir").toString();
				int port=(Integer)infoMap.get("port");
				int reply;
				ftp.connect(host, port);
				// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
				ftp.login(username, password);// 登录
				reply = ftp.getReplyCode();
				if (!FTPReply.isPositiveCompletion(reply)) {
					System.out.println("无法连接到FTP");
					ftp.disconnect();
					return result;
				}
				ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
				FTPFile[] fs = ftp.listFiles();
				for (FTPFile ff : fs) { //解决中文乱码问题,两次解码  
		            byte[] bytes=ff.getName().getBytes("iso-8859-1");  
		            String fn=new String(bytes,"utf8");  
		            if (fn.equalsIgnoreCase(fileName)) {
						File localFile = new File(localPath);

						OutputStream os = new FileOutputStream(localFile);
						ftp.retrieveFile(ff.getName(), os);
						os.close();
						result = true;
					}
				}

				ftp.logout();
				if(!result)System.out.println("未在FTP服务器上找到:"+remotePath+"/"+fileName);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (ftp.isConnected()) {
					try {
						ftp.disconnect();
					} catch (IOException ioe) {
						ioe.printStackTrace();
					}
				}
			}
			return result;
		}
	
	
		/**
		 * 解析ftp地址信息
		 * @param ftpPath
		 * @return Map<String, Object>
		 */
		private static Map<String, Object> analyzeFTPPath(String ftpPath){		
			Map<String, Object> map=new HashMap<String, Object>();
			String userName,password,url,dir,urlPath="";
			int port=21;
			//ftp地址中是否包含密码  不包含密码时匿名登录
			String pattern = "^ftp://.*:.*@.*";
			Pattern r = Pattern.compile(pattern);
			Matcher matcher = r.matcher(ftpPath);
			if(matcher.matches()){
				//ftp://dhc:dhc@127.0.0.1:21/test/05.png 镇江瑞康
				String[] strArray=ftpPath.split("@");
				String logInfo=strArray[0].substring(6);
				userName=logInfo.split(":")[0];
				password=logInfo.split(":")[1];
				urlPath=strArray[1];
			}else{
				userName="anonymous";//匿名登录,空字符串不行  
				password= "121@hotmail.com";//随便一个地址  
				urlPath=ftpPath.substring(6);
			}
				
			//校验字符串是否包含端口号
			String urlParttern=".*:[0-9]{1,9}/.*";
			Pattern urlR=Pattern.compile(urlParttern);
			Matcher urlMatcher=urlR.matcher(urlPath);
			if(urlMatcher.matches()){
				String[] urlArray=urlPath.split(":");
				url=urlArray[0];
				String[] splitArray=urlArray[1].split("/");
				port=Integer.parseInt(splitArray[0]);
				dir=urlArray[1].substring(urlArray[1].indexOf("/")+1);
			}else {
				String[] urlArray=urlPath.split("/");
				url=urlArray[0];
				dir=urlPath.substring(urlPath.indexOf("/")+1);
			}
			map.put("userName", userName);
			map.put("password", password);
			map.put("url", url);
			map.put("dir", dir);
			map.put("port", port);
			return map;
		}
	
		
	
	
	public static void main(String[] args) {
//		boolean ret= FTPUtil.downloadFile(ConstantUtil.FTP_IP, ConstantUtil.FTP_PORT, ConstantUtil.FTP_USERNAME,
//			ConstantUtil.FTP_PASSWORD, ConstantUtil.FTP_DIR, "dhcpeireport.normal.pdf", "D:\\logs\\1.pdf");
		
		try {
			InputStream input = new FileInputStream(new File("D:\\tmp\\png\\fivestar.png"));
			boolean ret=FTPUtil.uploadFile("ftp://dhc:dhc@127.0.0.1:21/test", "fivestar.png", input);
			input.close();
			System.out.println(ret);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}
最近下载更多
sswert  LV2 2022年10月21日
crosa_Don  LV18 2022年6月7日
1265260263  LV4 2022年4月8日
zhou549014242  LV2 2021年10月31日
a82338181  LV7 2021年9月6日
15138754339  LV1 2021年8月16日
你是傻子  LV9 2021年5月24日
2235140624  LV17 2021年5月10日
lironggang  LV38 2020年12月25日
lzp12345687  LV10 2020年12月4日
最近浏览更多
22569889q 2023年6月30日
暂无贡献等级
毁灭者 2023年4月27日
暂无贡献等级
youwuzuichen  LV10 2023年3月22日
593174419  LV2 2023年1月9日
sswert  LV2 2022年10月21日
zhoujiangxi 2022年8月1日
暂无贡献等级
crosa_Don  LV18 2022年6月7日
xiao小果  LV13 2022年5月25日
1265260263  LV4 2022年4月8日
wang946427911 2022年4月2日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友