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日
暂无贡献等级