从ftp服务器下载文件到本地

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FtpTools { private final static String ftphostaddr = "127.0.0.1";//服务器地址 private final static String ftppath = "E:\\ftp_data";//操作的服务器目录 private final static String ftpname = "Administrator";//服务器登录名 private final static String ftppwd = "ytd123456";//登录密码 private final static String localpath = "E:\\dt_data"; private final static String fileSeparator = System.getProperty("file.separator"); private static final Logger logger = LoggerFactory.getLogger(FtpTools.class); public static void main(String[] args) { FtpTools tools = new FtpTools(); tools.downFile("RDClass.java"); } /** * 从文件服务器上下载文件到本地 * @param filename */ public static void downFile(String filename) { FTPClient ftp = initFtp(); try{ //4.指定要下载的目录 ftp.changeWorkingDirectory(ftppath);// 转移到FTP服务器目录 //5.遍历下载的目录 FTPFile[] fs = ftp.listFiles(); for (FTPFile ff : fs) { //解决中文乱码问题,两次解码 byte[] bytes=ff.getName().getBytes("iso-8859-1"); String fn=new String(bytes,"utf8"); if (fn.equals(filename)) { //6.写操作,将其写入到本地文件中 logger.info("下载文件:"+filename+"开始:"+System.currentTimeMillis()); File localFile = new File(localpath +fileSeparator+ ff.getName()); OutputStream is = new FileOutputStream(localFile); ftp.retrieveFile(ff.getName(), is); //7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除(这步一般不用操作,为啥要删除服务器上面的文件呢) if(localFile.exists()){ logger.info("删除服务器上文件:"+filename); ftp.deleteFile(ff.getName()); } logger.info("下载文件:"+filename+"结束:"+System.currentTimeMillis()); is.close(); } } ftp.logout(); }catch(Exception e){ e.printStackTrace(); new Exception("从服务器下载文件过程中发生错误"); }finally{ if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { ioe.printStackTrace(); } } } } public static FTPClient initFtp() { int reply; FTPClient ftp = new FTPClient(); try { // 1.连接服务器 //ftp.connect(ftphostaddr); ftp.connect(ftphostaddr, 21); // 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.login(ftpname, ftppwd); // 3.判断登陆是否成功 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); } } catch (Exception e) { e.printStackTrace(); new Exception("服务器连接失败"); } return ftp; } }

public void initDtData(fhycgz e) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String thatDate = sdf.format(e.getRq()); String dirPath = fhycgzController.class.getClassLoader().getResource("/").getPath() + File.separator + "conf"; Properties p = new Properties(); try { p.load(new FileInputStream(dirPath + File.separator + "app.properties")); String addr = p.getProperty("ftp.dt.service.addr"); String ftpPath = p.getProperty("ftp.dt.service.ftpPath"); String name = p.getProperty("ftp.dt.service.name"); String pwd = p.getProperty("ftp.dt.service.pwd"); String localPath = p.getProperty("ftp.dt.service.localPath"); String fileName = "RDClass.java"; FtpTools.downFile(addr, name, pwd, 21, ftpPath, fileName, localPath); // 遍历本地所有文件,查找当天的dt文件 File file = new File(localPath); File[] listFiles = file.listFiles(); for (File f : listFiles) { logger.info("getName--->=" + f.getName()); if (f.isFile() && f.getName().contains(thatDate)) { this.getTdByTdName(localPath + File.separator + f.getName()); } } } catch (IOException e1) { e1.printStackTrace(); } }

package com.ytd.ebos.platform.fhycgz.controller; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FtpTools { private static final Logger logger = LoggerFactory.getLogger(FtpTools.class); public static void main(String[] args) { // FtpTools tools = new FtpTools(); // tools.downFile("RDClass.java"); } /** * 从文件服务器上下载文件到本地 * * @param addr 服务器地址 * @param name 服务器登录名 * @param pwd 登录密码 * @param port 端口 * @param ftpPath 操作的服务器目录 * @param fileName 需要下载的文件名 * @param localPath 本地存放文件的目录 */ public static void downFile(String addr,String name,String pwd,int port,String ftpPath,String fileName,String localPath) { FTPClient ftp = initFtp(addr,name,pwd,port); try { // 4.指定要下载的目录 ftp.changeWorkingDirectory(ftpPath);// 转移到FTP服务器目录 // 5.遍历下载的目录 FTPFile[] fs = ftp.listFiles(); for (FTPFile ff : fs) { // 解决中文乱码问题,两次解码S byte[] bytes = ff.getName().getBytes("iso-8859-1"); String fn = new String(bytes, "utf8"); if (fn.equals(fileName)) { // 6.写操作,将其写入到本地文件中 logger.info("下载文件:" + fileName + "开始:" + System.currentTimeMillis()); File localFile = new File(localPath + File.separator + ff.getName()); OutputStream is = new FileOutputStream(localFile); ftp.retrieveFile(ff.getName(), is); // 7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除 // if(localFile.exists()){ // logger.info("删除服务器上文件:"+filename); // ftp.deleteFile(ff.getName()); // } logger.info("下载文件:" + fileName + "结束:" + System.currentTimeMillis()); is.close(); } } ftp.logout(); } catch (Exception e) { e.printStackTrace(); new Exception("从服务器下载文件过程中发生错误"); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { ioe.printStackTrace(); } } } } public static FTPClient initFtp(String addr,String name,String pwd,int port ) { int reply; FTPClient ftp = new FTPClient(); try { // 1.连接服务器 // ftp.connect(ftphostaddr); ftp.connect(addr, port); // 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.login(name, pwd); // 3.判断登陆是否成功 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); } } catch (Exception e) { e.printStackTrace(); new Exception("服务器连接失败"); } return ftp; } }

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Properties; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FtpTools { private static final Logger logger = LoggerFactory.getLogger(FtpTools.class); public static void main(String[] args) { // FtpTools tools = new FtpTools(); // tools.downFile("RDClass.java"); } /** * 从文件服务器上下载文件到本地 * * @param addr 服务器地址 * @param name 服务器登录名 * @param pwd 登录密码 * @param port 端口 * @param ftpPath 操作的服务器目录 * @param fileName 需要下载的文件名 * @param localPath 本地存放文件的目录 */ public static void downFile(String addr,String name,String pwd,int port,String ftpPath,String fileName,String localPath) { FTPClient ftp = initFtp(addr,name,pwd,port); try { ftp.changeWorkingDirectory(ftpPath);// 转移到FTP服务器目录 String dirPath = FtpTools.class.getClassLoader().getResource("/").getPath() + File.separator + "conf"; Properties p = new Properties(); p.load(new FileInputStream(dirPath + File.separator + "ebos-app.properties")); String encode = p.getProperty("ftp.dt.service.encoding"); if(encode==null){ encode="gb2312"; } ftp.setControlEncoding(encode); ftp.enterLocalPassiveMode(); ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 4.指定要下载的目录 // 5.遍历下载的目录 FTPFile[] fs = ftp.listFiles(); for (FTPFile ff : fs) { // 解决中文乱码问题,两次解码S // byte[] bytes = ff.getName().getBytes("iso-8859-1"); // byte[] bytes = ff.getName().getBytes("GB2312"); logger.info("getName:" + ff.getName()); // String fn = new String(bytes, "utf8"); String fn = ff.getName(); if (fn.contains(fileName)) { // 6.写操作,将其写入到本地文件中 long start = System.currentTimeMillis(); logger.info("下载文件:" + fn + "开始:" + start); File localFile = new File(localPath + File.separator + fn); OutputStream os = new FileOutputStream(localFile); // ftp.retrieveFile(fn, os); ftp.retrieveFile(new String(fn.getBytes(encode), "iso-8859-1"), os); // 7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除 // if(localFile.exists()){ // logger.info("删除服务器上文件:"+filename); // ftp.deleteFile(ff.getName()); // } long end = System.currentTimeMillis(); logger.info("下载文件:" + fn + "结束:" + end+",用时"+(end-start)/1000+"秒"); os.close(); } } ftp.logout(); } catch (Exception e) { new Exception("从服务器下载文件过程中发生错误"+e.getMessage()); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { new Exception("从服务器下载文件过程中发生错误"+ioe.getMessage()); } } } } public static FTPClient initFtp(String addr,String name,String pwd,int port ) { int reply; FTPClient ftp = new FTPClient(); try { // 1.连接服务器 // ftp.connect(ftphostaddr); ftp.connect(addr, port); // 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.login(name, pwd); // 3.判断登陆是否成功 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); } } catch (Exception e) { new Exception("服务器连接失败"); } return ftp; } }
下载的文件名有中文时可以这样设置FTPClient的参数:
ftp.retrieveFile(new String(fn.getBytes("GB2312"), "iso-8859-1"), os);