ftp上传下载文件,是遵照ftp协议上传下载文件的,本例仅以下载文件为例。
重要的方法解释:
1.FTP功能相关依赖路径:org.apache.commons.net.ftp.*;
2.ftp默认端口是21,如果非默认端口连接,需指定:ftp.connect(ftphostaddr, 22);//22为端口号
3.ftp.changeWorkingDirectory(ftppath) //实现切换目录
4.FTPFile[] fs = ftp.listFiles(); 获取指定目录下的文件列表
public class FtpTools { private final static String ftphostaddr = "xxx";//服务器地址 private final static String ftppath = "xxx";//操作的服务器目录 private final static String ftpname = "xxx";//服务器登录名 private final static String ftppwd = "xxx";//登录密码 private final static String localpath = getCurentContentPath()+"uploadfiles"; private final static String fileSeparator = System.getProperty("file.separator"); private static final Logger LOGGER = Logger.getLogger(FtpTools.class); public static void main(String[] args) { FtpTools tools = new FtpTools(); tools.downFile("test.txt"); } /** * 从文件服务器上下载文件到本地 * @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, 22); // 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 static String getCurentContentPath(){ String path = ""; path = FtpTools.class.getClassLoader().getResource("").toString(); path = path.replace("file:", "").substring(0, path.indexOf("WEB-INF")).replace("WEB-IN", "").replace("WEB-I", ""); return path; } }