操作系统环境:windows7
本地IP地址:192.168.0.110
FTP保存目录:D:/bfp/FTP
1、FTP的搭建:可以使用win7自带的FTP,搭建方法可以百度。我使用的是"ftpserversetup_10232(FTP搭建工具).exe",安装过程很简单,根据提示下一步下一步操作即可。
2、启动服务器
3、访问FTP:随便打开一个目录,在地址栏上输入:ftp://192.168.0.110/,回车,第一次登陆需要输入搭建FTP时创建的用户名和密码,登陆成功后就会看到FTP中的文件(注意权限,必须有相应权限)
4、文件的上传下载:图形化界面的上传下载比较简单,这里贴一下使用Java代码实现的上传下载。
说明:文件夹为中文的情况没有处理,可能会出现中文乱码
代码如下:
4.1 FTP用户名、密码等,及main测试方法:
private static String ftpIP="192.168.0.110";//FTP地址 private static int port = 21;//端口号 private static String username="wjl";//登陆ftp的用户名 private static String pwd="123456";//登陆ftp的密码 private static FTPClient ftpClient=null;//FTP客户端代理 private static int timeout=2*60*100;//2分钟,以毫秒为单位 /** * 该方法用来测试FTP的上传和下载 * @throws UnsupportedEncodingException */ public static void main(String[] args){ boolean result=false; /* //1、连接FTP result = connectFTPServer(); if(result){ System.out.println("连接成功"); }else{ System.out.println("连接失败"); } */ /* //2、上传单个文件 result = uploadFile(new File("D:\\temp\\1.jpg")); if(result){//下载完成 System.out.println("上传完成!"); closeConnect();//关闭连接 } */ /* //3、上传整个文件夹 result = uploadFile(new File("D:\\temp")); if(result){//下载完成 System.out.println("上传完成!"); closeConnect();//关闭连接 } */ /* //4、下载单个文件 //result = downloadFile(new File("\\photo\\1.jpg"),new File("D:\\temp2\\123.jpg"));//指定文件名 result = downloadFile(new File("\\photo\\1.jpg"),new File("D:\\temp2"));//只指定目录 if(result){//下载完成 System.out.println("下载完成!"); closeConnect();//关闭连接 } */ //5、下载文件夹 result = downloadFile(new File("\\photo"),new File("D:\\temp22")); //result = downloadFile(new File("\\photo\\1.jpg"),new File("D:\\temp2"));//只指定目录 if(result){//下载完成 System.out.println("下载完成!"); closeConnect();//关闭连接 } }
4.2连接FTP:
/** * 该方法用来连接FTP * @return true:连接成功 false:链接失败 * **/ private static boolean connectFTPServer(){ boolean result = true; if(ftpClient==null){//说明还没有初始化 int reply; try { ftpClient = new FTPClient(); //注:必须先login然后再设置其他属性,否则即便文件上传成功文件也会损坏 //ftpClient.connect(ftpIP, port);//连接 ftpClient.connect(ftpIP);//连接FTP客户端 ftpClient.setDefaultPort(port);//端口号 ftpClient.login(username, pwd);//登陆 ftpClient.setControlEncoding("UTF-8");//编码 ftpClient.setDataTimeout(timeout);//设置超时时间 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型(二进制) ftpClient.setBufferSize(1024);//缓冲区大小 reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) {//连接失败 ftpClient.disconnect();//关闭连接 result=false; } }catch (SocketException e) { result = false; e.printStackTrace(); System.err.println("登录ftp服务器 " + ftpIP + " 失败,连接超时!"); } catch (IOException e) { result = false; e.printStackTrace(); System.err.println("登录ftp服务器 " + ftpIP + " 失败,FTP服务器无法打开!"); } } return result; }
4.3、上传文件(包括上传文件和文件夹)
/** * 上传文件 * 单个文件上传至:FTP根目录+当前年月日+随机名称.上传文件后缀名 * 多个文件上传至:FTP根目录+当前年月日+上传的文件夹 * @param file:要上传的文件或文件夹 * @return true:上传成功 false:上传失败 */ public static boolean uploadFile(File file) { boolean result = true; FileInputStream fis = null; try { connectFTPServer();//连接FTP //根据当前时间对文件进行分类 String filePath = getFilePath(); ftpClient.makeDirectory(filePath);//在ftp下创建目录 ftpClient.changeWorkingDirectory(filePath);//切换目录 if(isDir(file.getPath())){//上传的是文件夹 String changeWorkDirectory = filePath+file.getPath().substring(2);//截取掉最开始的D:两个字段 //System.out.println("切换目录:"+changeWorkDirectory); ftpClient.makeDirectory(changeWorkDirectory);//使用文件夹原本的名称并创建 ftpClient.changeWorkingDirectory(changeWorkDirectory);//切换目录 String[] files = file.list();//循环文件夹下的所有文件 for (int i = 0; i < files.length; i++) { File file1 = new File(file.getPath() + File.separator + files[i]); if (file1.isDirectory()) {//若还有文件夹,那么递归上传 uploadFile(file1); ftpClient.changeToParentDirectory();//切换至父级目录 } else { //若是文件了,那么直接上传 File file2 = new File(file.getPath() + File.separator + files[i]); fis = new FileInputStream(file2); ftpClient.storeFile(file2.getName(), fis);//使用原本的名称 System.out.println("文件"+file2.getPath()+"上传成功,上传目录:"+(changeWorkDirectory+File.separator+file2.getName())); } } }else{ //单个文件 File srcFile = new File(file.getPath()); //选择要上传的文件 fis = new FileInputStream(srcFile); //为了避免文件名重复被覆盖,此处选择随机命名 String fileName = System.currentTimeMillis()+getFileSuffix(file.getName());//获取文件路径和名称 ftpClient.storeFile(fileName, fis); //保存的ftp服务器上的文件名,上传ftp System.out.println("文件"+file.getPath()+"上传成功,上传目录:"+(filePath+fileName)); } } catch (Throwable e) { result=false; e.printStackTrace(); throw new RuntimeException("文件上传失败!", e); } finally { //此处不能关闭ftpClient,因为当上传文件夹时会递归调用,待递归调用结束时会调用该方法,而主方法尚未完成,因此会导致空指针异常 IOUtils.closeQuietly(fis); //关闭fis } return result; }
4.4 下载文件(包括下载文件和文件夹)
/** * 下载文件 * @param ftpFile:要下载的文件或文件夹 * @param dstFile:保存的文件或文件夹,若指定文件名称就使用指定的名称和目录,若是文件夹则文件名称采用ftp上要下载的文件的名称 */ public static boolean downloadFile(File ftpFile,File dstFile) { boolean result = true; FileOutputStream fos = null; try { connectFTPServer();//连接FTP //判断要下载的是个文件夹还是个文件 if(isDir(ftpFile.getPath())){ ftpClient.changeWorkingDirectory(ftpFile.getPath());//切换目录 String[] files = ftpClient.listNames();//循环文件夹下的所有文件 String path = ""; for (int i = 0; i < files.length; i++) { path = ftpFile.getPath() + File.separator + files[i]; File file1 = new File(path);//FTP上的文件名称 if (isDir(file1.getPath())) {//若还有文件夹,那么递归上传 downloadFile(file1,dstFile); } else { //若是文件了,那么直接下载 //判断保存到本地的目录 String localParent = ""; if(isDir(dstFile.getPath())){//告知了一个文件夹 if(!dstFile.exists()){dstFile.mkdirs();} localParent = dstFile.getPath(); }else{ if(!dstFile.getParentFile().exists()){dstFile.getParentFile().mkdirs();} localParent=dstFile.getParentFile().getPath(); } //本地路径+FTP上选定文件夹的目录+文件名称 String localFileName = localParent+File.separator+ftpFile.getPath() + File.separator + files[i]; File localFile = new File(localFileName); if(!localFile.getParentFile().exists()){localFile.getParentFile().mkdirs();} fos = new FileOutputStream(localFile); //下载到本地的文件的名字 ftpClient.retrieveFile(file1.getName(), fos); //从ftp上下载到本地 System.out.println(file1.getPath()+"下载至:"+localFileName+",下载成功"); } } }else{//单个文件 //从ftp上下载文件的目录 ftpClient.changeWorkingDirectory(ftpFile.getParent());//切换至选定文件夹的上一级目录 //保存的目录 String newFileName = ""; //判断是否存在 if(isDir(dstFile.getPath())){//将文件保存到一个目录下 if(!dstFile.exists()){dstFile.mkdirs();} //文件名称格式:指定目录+FTP中文件的名称 newFileName = dstFile.getPath()+File.separator+ftpFile.getName(); }else{//将文件保存为指定的文件 if(!dstFile.getParentFile().exists()){dstFile.getParentFile().mkdirs();} newFileName=dstFile.getPath(); } System.out.println("文件保存到的目录:"+newFileName); fos = new FileOutputStream(newFileName); //下载到本地的文件的名字 ftpClient.retrieveFile(ftpFile.getName(), fos); //从ftp上下载到本地 System.out.println(ftpFile.getPath()+"下载成功,下载至:"+newFileName); } } catch (IOException e) { result = false; e.printStackTrace(); throw new RuntimeException("下载文件失败!", e); } finally { //此处不能关闭ftpClient,因为当上传文件夹时会递归调用,待递归调用结束时会调用该方法,而主方法尚未完成,因此会导致空指针异常 IOUtils.closeQuietly(fos); } return result; }
4.5 关闭连接
/** * 关闭连接 */ public static void closeConnect() { try { if (ftpClient != null) { ftpClient.disconnect(); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("关闭FTP连接发生异常!", e); } }
4.6、其他的一些辅助方法
/** * 该方法用来判断给定的字符串是不是文件夹 * @param filePath:可能是文件夹,也可能是文件 * @return boolean :true:文件夹 false:文件 * **/ public static boolean isDir(String filePath){ boolean result = false; //获取最后一个/的后面部分 filePath = filePath.substring(filePath.lastIndexOf("/") + 1); // 在这里可以记录用户和文件信息 //判断是否有.若没有,说明是文件夹,否则是文件(也可能是带有.的文件夹,此处不处理) if(filePath.indexOf(".")!=-1){//说明 result = false; }else{//没有,是文件夹 result=true; } return result; } //该方法用来获取文件的后缀名 public static String getFileSuffix(String fileName){ fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); // 在这里可以记录用户和文件信息 fileName = fileName.substring(fileName.lastIndexOf(".")); return fileName; } /** * 该方法用来获取文件的保存名称,包括路径和名称 * @param fileName:不包含目录的文件名称 * @return yyyyMMdd/System.currentTimeMillis().后缀名 * **/ public static String getFileName(String fileName){ GregorianCalendar ggcalendar=new GregorianCalendar(Locale.CHINA); int year = ggcalendar.get(Calendar.YEAR);; int month = ggcalendar.get(Calendar.MONTH)+1; int date = ggcalendar.get(Calendar.DATE); return (year+""+month+""+date)+File.separator+System.currentTimeMillis()+getFileSuffix(fileName); } /** * 该方法用来获取文件的保存路径 * @param fileName:不包含目录的文件名称 * @return yyyyMMdd/System.currentTimeMillis().后缀名 * **/ public static String getFilePath(){ GregorianCalendar ggcalendar=new GregorianCalendar(Locale.CHINA); int year = ggcalendar.get(Calendar.YEAR);; int month = ggcalendar.get(Calendar.MONTH)+1; int date = ggcalendar.get(Calendar.DATE); return File.separator+(year+""+month+""+date)+File.separator; } /** * 删除一个文件 */ public static boolean deleteFile(String filename) { boolean result = true; try { connectFTPServer(); File f = new File(filename); System.out.println(f.exists()); result = ftpClient.deleteFile(filename); } catch (IOException e) { result=false; e.printStackTrace(); throw new RuntimeException("删除文件"+filename+"失败!", e); } return result; } /** * 删除指定目录:先删除该目录下的文件,最后删除目录 */ public static void deleteDirectory(String pathname) { try { connectFTPServer(); File file = new File(pathname); if (file.isDirectory()) { File file2[] = file.listFiles(); for(int i=0;i<file2.length;i++){ deleteDirectory(file.getPath() + File.separator + file2[i]); } } else {//删除文件 deleteFile(pathname); } ftpClient.removeDirectory(pathname); }catch (IOException e) { e.printStackTrace(); throw new RuntimeException("删除目录失败!", e); } } /** * 删除空目录 */ public static void deleteEmptyDirectory(String pathname) { try { connectFTPServer(); ftpClient.removeDirectory(pathname); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("删除空目录失败!", e); } } /** * 列出服务器上文件和目录 */ public static void listRemoteFiles(String regStr) { connectFTPServer(); try { String files[] = ftpClient.listNames(regStr); if (files == null || files.length == 0) System.out.println("没有任何文件!"); else { for (int i = 0; i < files.length; i++) { System.out.println(files[i]); } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("列出FTP服务器上指定目录的文件时失败失败!", e); } } /** * 列出Ftp服务器上的所有文件和目录 */ public static void listRemoteAllFiles() { connectFTPServer(); try { String[] names = ftpClient.listNames(); for (int i = 0; i < names.length; i++) { System.out.println(names[i]); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("列出FTP服务器上所有文件和目录时失败!", e); } } /** * 在服务器上创建一个文件夹 */ public static boolean makeDirectory(String dir) { connectFTPServer(); boolean result = true; try { result = ftpClient.makeDirectory(dir); } catch (Exception e) { result = false; e.printStackTrace(); throw new RuntimeException("创建文件夹失败!", e); } return result; }
参考链接:
1、http://747017186.iteye.com/blog/2211514
2、http://lavasoft.blog.51cto.com/62575/100386/
推荐链接:
1、官网FTPClient的API:http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClientConfig.html
2、FTPClient各个属性说明:http://blog.csdn.net/hazard88/article/details/8676119
相关推荐
Java 中使用 FTPClient 实现上传下载文件 Java 中使用 FTPClient 实现上传下载文件是 Java 程序中经常需要和 FTP 打交道的重要内容。FTPClient 是 Jakarta Commons 中的一个工具类,位于 Commons Net 包中。...
在本文中,我们将深入探讨如何使用FTPClient来实现FTP文件上传,特别是处理中文文件名的上传问题。 FTP是一种广泛使用的互联网协议,允许用户在两台计算机之间传输文件。在Java中,我们可以利用Apache Commons Net...
本文将详细介绍如何使用FTPClient来实现文件的上传和下载操作。 首先,要使用FTPClient进行文件传输,你需要在项目中引入Apache Commons Net库。这个库包含了FTPClient和其他与网络通信相关的类,可以通过Maven或...
FTPClient是Java中实现FTP功能的一个库,它提供了丰富的API,使得开发者能够方便地与FTP服务器进行交互,包括上传、下载和删除文件。在这个项目中,我们将会深入探讨如何使用FTPClient来完成这些操作。 首先,要...
通过使用Java中的FTPClient库,开发人员可以轻松地在应用程序中集成FTP功能,实现文件的远程上传和下载。本文详细介绍了如何使用FTPClient进行这些操作,包括连接、登录、上传文件和断开连接的步骤。这为开发需要与...
在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件。 一、上传文件 原理不介绍了,大家直接...
在Java程序中,使用FTPClient可以方便地实现文件的上传和下载。 2. **FTP文件上传**: - 首先,通过`FTPClient.connect()`方法建立与FTP服务器的连接。连接时可以指定主机名(URL)和端口号。默认FTP端口是21,如果...
本篇文章将围绕如何使用Java中的`FTPClient`库来实现文件的上传与下载操作展开详细介绍。 #### 二、Java FTPClient 库介绍 `FTPClient`是Java中用于处理FTP(文件传输协议)连接的一个类,它位于`commons-net`包中...
使用 FTPClient 工具类上传下载文件需要以下步骤: 1. 创建 FtpUseBean 对象,设置 FTP 服务器的主机名、端口号、用户名、密码等信息。 2. 使用 FTPClient 连接 FTP 服务器。 3. 上传文件:使用 FTPClient 的 ...
在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。这个过程涉及到几个关键步骤,包括连接到FTP服务器、登录、设置传输模式、下载文件以及断开连接。 首先,你...
在本文中,我们将深入探讨如何使用Apache Commons Net库和Java内置的`sun.net.ftp.FtpClient`来实现FTP(文件传输协议)的功能,包括上传、下载、批量操作以及删除文件。这两个库提供了丰富的API,使得在Java应用...
本主题将深入探讨如何使用`FtpClient`类从Apache Commons Net库来实现文件上传功能。Apache Commons Net提供了丰富的FTP操作接口,使得开发者能够方便地执行包括上传、下载、删除等在内的各种FTP操作。 首先,我们...
org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能
这个库使得开发者可以方便地实现文件的上传和下载功能。在给定的标题和描述中,主要涉及了如何使用Java FTPClient进行文件上传和下载的操作。 首先,为了使用FTPClient,你需要在项目中引入相关的依赖库。如标签所...
### FTPClient上传下载功能详解及断点续传技术解析 #### 一、FTPClient简介 FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议,主要用于在不同主机之间传输文件。`FTPClient`是Apache ...
Android 使用 FTP 方式实现文件上传和下载 Android 使用 FTP 方式实现文件上传和下载是移动应用开发中的一项重要功能,特别是在 OTA 在线升级项目中,文件上传和下载是一个关键步骤。下面就 Android 使用 FTP 方式...
4. **文件上传与下载**:这是FTP的主要用途,FTPClient提供了上传本地文件到服务器,以及从服务器下载文件到本地的功能。 5. **数据传输模式**:FTP有两种数据传输模式,主动(PORT)模式和被动(PASV)模式。...
FTPClient 是一个基于 Java 的 FTP 客户端库,提供了丰富的 FTP 操作 API,例如上传、下载、删除文件等。然而,在高并发场景下,频繁创建和销毁 FTPClient 对象可能会对服务器造成很大的压力。 为了解决这个问题,...
本文将深入探讨如何使用Java实现FTP文件上传和下载,包括基本概念、核心类库、实现步骤以及测试用例。 首先,Java通过`java.net`和`org.apache.commons.net.ftp`两个主要库支持FTP操作。`java.net`库中的`FTPClient...