Java FTP 实现跨服务器文件上传下载


        文件传输协议(FTP:File Transfer Protocol)使得主机间可以共享文件。 FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似 TELNET 协议在主机间交换命令和消息。文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。

        Java FTP 实现跨服务器文件上传下载

        实现原理:文件存储服务器端安装 Serv-U FTP服务器,环境配好后通过Java程序访问(读取、写入等操作)目录:

        Serv-U服务器环境配好之后,本机可通过在 Windows 资源管理器或浏览器中打开 FTP 站点测试能否访问,如:ftp://192.168.1.2

        输入用户名、密码点击登录后便可访问共享目录,访问目的用以测试Serv-U服务器环境是否搭建成功

        具体Serv-U服务器相关配置信息详见资源内介绍,在此不累赘描述,Serv-U下载地址:http://download.csdn.net/detail/for_china2012/6574769

        Serv-U服务器环境搭建成功后,便可通过Java程序访问:

  1. package com.ftp.util;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8.   
  9. import org.apache.commons.net.ftp.FTPClient;  
  10. import org.apache.commons.net.ftp.FTPReply;  
  11.   
  12. /** 
  13.  * FTP服务器工具类 
  14.  *  
  15.  * @author 码农先生 
  16.  * @version 1.0 
  17.  * @date 2013-11-18 
  18.  */  
  19. public class FTPUtil {  
  20.       
  21.     /** 
  22.      * 上传文件至FTP服务器 
  23.      *  
  24.      * @param url 
  25.      *      服务器IP地址 
  26.      * @param port 
  27.      *      服务器端口 
  28.      * @param userName 
  29.      *      用户登录名 
  30.      * @param password 
  31.      *      用户登录密码 
  32.      * @param storePath 
  33.      *      服务器文件存储路径 
  34.      * @param fileName 
  35.      *      服务器文件存储名称 
  36.      * @param is 
  37.      *      文件输入流 
  38.      * @return 
  39.      *      <b>true</b>:上传成功 
  40.      *      <br/> 
  41.      *      <b>false</b>:上传失败 
  42.      */  
  43.     public static boolean storeFile (String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {  
  44.         boolean result = false;  
  45.         FTPClient ftp = new FTPClient();  
  46.         try {  
  47.             // 连接至服务器,端口默认为21时,可直接通过URL连接  
  48.             ftp.connect(url ,port);  
  49.             // 登录服务器  
  50.             ftp.login(userName, password);  
  51.             // 判断返回码是否合法  
  52.             if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {  
  53.                 // 不合法时断开连接  
  54.                 ftp.disconnect();  
  55.                 // 结束程序  
  56.                 return result;  
  57.             }  
  58.             // 设置文件操作目录  
  59.             ftp.changeWorkingDirectory(storePath);  
  60.             // 设置文件类型,二进制  
  61.             ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
  62.             // 设置缓冲区大小  
  63.             ftp.setBufferSize(3072);  
  64.             // 上传文件  
  65.             result = ftp.storeFile(fileName, is);  
  66.             // 关闭输入流  
  67.             is.close();  
  68.             // 登出服务器  
  69.             ftp.logout();  
  70.         } catch (IOException e) {  
  71.             e.printStackTrace();  
  72.         } finally {  
  73.             try {  
  74.                 // 判断输入流是否存在  
  75.                 if (null != is) {  
  76.                     // 关闭输入流  
  77.                     is.close();  
  78.                 }  
  79.                 // 判断连接是否存在  
  80.                 if (ftp.isConnected()) {  
  81.                     // 断开连接  
  82.                     ftp.disconnect();  
  83.                 }  
  84.             } catch (IOException e) {  
  85.                 e.printStackTrace();  
  86.             }  
  87.         }  
  88.         return result;  
  89.     }  
  90.       
  91.     /** 
  92.      * 从FTP服务器下载文件至本地 
  93.      *  
  94.      * @param url 
  95.      *      服务器IP地址 
  96.      * @param port 
  97.      *      服务器端口 
  98.      * @param userName 
  99.      *      用户登录名 
  100.      * @param password 
  101.      *      用户登录密码 
  102.      * @param remotePath 
  103.      *      服务器文件存储路径 
  104.      * @param fileName 
  105.      *      服务器文件存储名称 
  106.      * @param localPath 
  107.      *      本地文件存储路径 
  108.      * @return 
  109.      *      <b>true</b>:下载成功 
  110.      *      <br/> 
  111.      *      <b>false</b>:下载失败 
  112.      */  
  113.     public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {  
  114.         boolean result = false;  
  115.         FTPClient ftp = new FTPClient();  
  116.         OutputStream os = null;  
  117.         try {  
  118.             // 连接至服务器,端口默认为21时,可直接通过URL连接  
  119.             ftp.connect(url ,port);  
  120.             // 登录服务器  
  121.             ftp.login(userName, password);  
  122.             // 判断返回码是否合法  
  123.             if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {  
  124.                 // 不合法时断开连接  
  125.                 ftp.disconnect();  
  126.                 // 结束程序  
  127.                 return result;  
  128.             }  
  129.             // 设置文件操作目录  
  130.             ftp.changeWorkingDirectory(remotePath);  
  131.             // 设置文件类型,二进制  
  132.             ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
  133.             // 设置缓冲区大小  
  134.             ftp.setBufferSize(3072);  
  135.             // 设置字符编码  
  136.             ftp.setControlEncoding("UTF-8");  
  137.             // 构造本地文件对象  
  138.             File localFile = new File(localPath + "/" + fileName);  
  139.             // 获取文件操作目录下所有文件名称  
  140.             String[] remoteNames = ftp.listNames();  
  141.             // 循环比对文件名称,判断是否含有当前要下载的文件名  
  142.             for (String remoteName: remoteNames) {  
  143.                 if (fileName.equals(remoteName)) {  
  144.                     result = true;  
  145.                 }  
  146.             }  
  147.             // 文件名称比对成功时,进入下载流程  
  148.             if (result) {  
  149.                 // 构造文件输出流  
  150.                 os = new FileOutputStream(localFile);  
  151.                 // 下载文件  
  152.                 result = ftp.retrieveFile(fileName, os);  
  153.                 // 关闭输出流  
  154.                 os.close();  
  155.             }  
  156.             // 登出服务器  
  157.             ftp.logout();  
  158.         } catch (IOException e) {  
  159.             e.printStackTrace();  
  160.         } finally {  
  161.             try {  
  162.                 // 判断输出流是否存在  
  163.                 if (null != os) {  
  164.                     // 关闭输出流  
  165.                     os.close();  
  166.                 }  
  167.                 // 判断连接是否存在  
  168.                 if (ftp.isConnected()) {  
  169.                     // 断开连接  
  170.                     ftp.disconnect();  
  171.                 }  
  172.             } catch (IOException e) {  
  173.                 e.printStackTrace();  
  174.             }  
  175.         }  
  176.         return result;  
  177.     }  
  178.       
  179.     public static void main(String[] args) {  
  180. //      try {  
  181. //          FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/软件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));  
  182. //          System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", RandomUUID.random() + ".zip", fis));  
  183. //      } catch (FileNotFoundException e) {  
  184. //          e.printStackTrace();  
  185. //      }  
  186.         System.out.println(retrieveFile("192.168.1.2"21"admin""1""C:/Documents and Settings/Administrator/桌面""ab86b6a3fbd14b94bdbac6b9aa971a99.zip""C:/Users/Administrator/Desktop"));  
  187.     }  
  188.       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值