`
yongpeng
  • 浏览: 29645 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

sun.net.ftp.FtpClient使用

阅读更多

FTP使用sun.net.ftp包下的api,
package jing.upfile;


import sun.net.ftp.*;
import sun.net.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.StringTokenizer;

/**
    FTP远程命令列表<br>
USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT<br>
PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS<br>
ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH<br>
REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ<br>
QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT<br>
     在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n<br>
          ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令<br>
          ftpclient.readServerResponse一定要在sendServer后调用<br>
          nameList("/test")获取指目录下的文件列表<br>
          XMKD建立目录,当目录存在的情况下再次创建目录时报错<br>
          XRMD删除目录<br>
          DELE删除文件<br>
* <p>Title: 使用JAVA操作FTP服务器(FTP客户端)</p>
* <p>Description: 上传文件的类型及文件大小都放到调用此类的方法中去检测,比如放到前台JAVASCRIPT中去检测等
* 针对FTP中的所有调用使用到文件名的地方请使用完整的路径名(绝对路径开始)。
* </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: 静靖工作室</p>
* @author 欧朝敬  13873195792
* @version 1.0
*/

public class FtpUpfile {
    private FtpClient ftpclient;
    private String ipAddress;
    private int ipPort;
    private String userName;
    private String PassWord;
    /**
     * 构造函数
     * @param ip String 机器IP
     * @param port String 机器FTP端口号
     * @param username String FTP用户名
     * @param password String FTP密码
     * @throws Exception
     */
    public FtpUpfile(String ip, int port, String username, String password) throws
            Exception {
        ipAddress = new String(ip);
        ipPort = port;
        ftpclient = new FtpClient(ipAddress, ipPort);
        //ftpclient = new FtpClient(ipAddress);
        userName = new String(username);
        PassWord = new String(password);
    }

    /**
     * 构造函数
     * @param ip String 机器IP,默认端口为21
     * @param username String FTP用户名
     * @param password String FTP密码
     * @throws Exception
     */
    public FtpUpfile(String ip, String username, String password) throws
            Exception {
        ipAddress = new String(ip);
        ipPort = 21;
        ftpclient = new FtpClient(ipAddress, ipPort);
        //ftpclient = new FtpClient(ipAddress);
        userName = new String(username);
        PassWord = new String(password);
    }


    /**
     * 登录FTP服务器
     * @throws Exception
     */
    public void login() throws Exception {
        ftpclient.login(userName, PassWord);
    }

    /**
     * 退出FTP服务器
     * @throws Exception
     */
    public void logout() throws Exception {
        //用ftpclient.closeServer()断开FTP出错时用下更语句退出
        ftpclient.sendServer("QUIT\r\n");
        int reply = ftpclient.readServerResponse(); //取得服务器的返回信息
    }

    /**
     * 在FTP服务器上建立指定的目录,当目录已经存在的情下不会影响目录下的文件,这样用以判断FTP
     * 上传文件时保证目录的存在目录格式必须以"/"根目录开头
     * @param pathList String
     * @throws Exception
     */
    public void buildList(String pathList) throws Exception {
        ftpclient.ascii();
        StringTokenizer s = new StringTokenizer(pathList, "/"); //sign
        int count = s.countTokens();
        String pathName = "";
        while (s.hasMoreElements()) {
            pathName = pathName + "/" + (String) s.nextElement();
            try {
                ftpclient.sendServer("XMKD " + pathName + "\r\n");
            } catch (Exception e) {
                e = null;
            }
            int reply = ftpclient.readServerResponse();
        }
        ftpclient.binary();
    }

    /**
     * 取得指定目录下的所有文件名,不包括目录名称
     * 分析nameList得到的输入流中的数,得到指定目录下的所有文件名
     * @param fullPath String
     * @return ArrayList
     * @throws Exception
     */
    public ArrayList fileNames(String fullPath) throws Exception {
        ftpclient.ascii(); //注意,使用字符模式
        TelnetInputStream list = ftpclient.nameList(fullPath);
        byte[] names = new byte[2048];
        int bufsize = 0;
        bufsize = list.read(names, 0, names.length); //从流中读取
        list.close();
        ArrayList namesList = new ArrayList();
        int i = 0;
        int j = 0;
        while (i < bufsize /*names.length*/) {
            //char bc = (char) names;
            //System.out.println(i + "  " + bc + " : " + (int) names);
            //i = i + 1;
            if (names == 10) { //字符模式为10,二进制模式为13
                //文件名在数据中开始下标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1
                //System.out.write(names, j, i - j);
                //System.out.println(j + "   " + i + "    " + (i - j));
                String tempName = new String(names, j, i - j);
                namesList.add(tempName);
                //System.out.println(temp);
                // 处理代码处
                //j = i + 2; //上一次位置二进制模式
                j = i + 1; //上一次位置字符模式
            }
            i = i + 1;
        }
        return namesList;
    }

    /**
     * 上传文件到FTP服务器,destination路径以FTP服务器的"/"开始,带文件名、
     * 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖
     * @param source String
     * @param destination String
     * @throws Exception
     */
    public void upFile(String source, String destination) throws Exception {
        buildList(destination.substring(0, destination.lastIndexOf("/")));
        ftpclient.binary(); //此行代码必须放在buildList之后
        TelnetOutputStream ftpOut = ftpclient.put(destination);
        TelnetInputStream ftpIn = new TelnetInputStream(new
                FileInputStream(source), true);
        byte[] buf = new byte[204800];
        int bufsize = 0;
        while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
            ftpOut.write(buf, 0, bufsize);
        }
        ftpIn.close();
        ftpOut.close();

    }


    /**
     * JSP中的流上传到FTP服务器,
     * 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖
     * 字节数组做为文件的输入流,此方法适用于JSP中通过
     * request输入流来直接上传文件在RequestUpload类中调用了此方法,
     * destination路径以FTP服务器的"/"开始,带文件名
     * @param sourceData byte[]
     * @param destination String
     * @throws Exception
     */
    public void upFile(byte[] sourceData, String destination) throws Exception {
        buildList(destination.substring(0, destination.lastIndexOf("/")));
        ftpclient.binary(); //此行代码必须放在buildList之后
        TelnetOutputStream ftpOut = ftpclient.put(destination);
        ftpOut.write(sourceData, 0, sourceData.length);
//        ftpOut.flush();
        ftpOut.close();
    }

    /**
     * 从FTP文件服务器上下载文件SourceFileName,到本地destinationFileName
     * 所有的文件名中都要求包括完整的路径名在内
     * @param SourceFileName String
     * @param destinationFileName String
     * @throws Exception
     */
    public void downFile(String SourceFileName, String destinationFileName) throws
            Exception {
        ftpclient.binary(); //一定要使用二进制模式
        TelnetInputStream ftpIn = ftpclient.get(SourceFileName);
        byte[] buf = new byte[204800];
        int bufsize = 0;
        FileOutputStream ftpOut = new FileOutputStream(destinationFileName);
        while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
            ftpOut.write(buf, 0, bufsize);
        }
        ftpOut.close();
        ftpIn.close();
    }

    /**
     *从FTP文件服务器上下载文件,输出到字节数组中
     * @param SourceFileName String
     * @return byte[]
     * @throws Exception
     */
    public byte[] downFile(String SourceFileName) throws
            Exception {
        ftpclient.binary(); //一定要使用二进制模式
        TelnetInputStream ftpIn = ftpclient.get(SourceFileName);
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        byte[] buf = new byte[204800];
        int bufsize = 0;

        while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
            byteOut.write(buf, 0, bufsize);
        }
        byte[] return_arraybyte = byteOut.toByteArray();
        byteOut.close();
        ftpIn.close();
        return return_arraybyte;
    }

    /**调用示例
     * FtpUpfile fUp = new FtpUpfile("192.168.0.1", 21, "admin", "admin");
     * fUp.login();
     * fUp.buildList("/adfadsg/sfsdfd/cc");
     * String destination = "/test.zip";
     * fUp.upFile("C:\\Documents and Settings\\Administrator\\My Documents\\sample.zip",destination);
     * ArrayList filename = fUp.fileNames("/");
     * for (int i = 0; i < filename.size(); i++) {
     *     System.out.println(filename.get(i).toString());
     * }
     * fUp.logout();
     * @param args String[]
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        FtpUpfile fUp = new FtpUpfile("192.150.189.22", 21, "admin", "admin");
        fUp.login();
        /*        fUp.buildList("/adfadsg/sfsdfd/cc");
                String destination = "/test/SetupDJ.rar";
                fUp.upFile(
         "C:\\Documents and Settings\\Administrator\\My Documents\\SetupDJ.rar",
                        destination);
                ArrayList filename = fUp.fileNames("/");
                for (int i = 0; i < filename.size(); i++) {
                    System.out.println(filename.get(i).toString());
                }

                fUp.downFile("/sample.zip", "d:\\sample.zip");
         */
        FileInputStream fin = new FileInputStream(
                "C:\\AAA.TXT");
        byte[] data = new byte[20480];
        fin.read(data, 0, data.length);
        fUp.upFile(data, "/test/BBB.exe");
        fUp.logout();
        System.out.println("程序运行完成!");
        /*FTP远程命令列表
         USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT
         PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS
         ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH
         REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ
         QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT
         */
        /*在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n
         ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令
         ftpclient.readServerResponse一定要在sendServer后调用
         nameList("/test")获取指目录下的文件列表
         XMKD建立目录,当目录存在的情况下再次创建目录时报错
         XRMD删除目录
         DELE删除文件
         */
    }
}

分享到:
评论
1 楼 pml346680914 2011-07-14  
很详细、不过有些地方代码有些错误呀 

相关推荐

    使用commons.net FTP 和sun.net.ftp.FtpClient 多种方式上传下载(包括批量)删除功能(一)

    3. **设置工作模式**:根据需求,可以切换到二进制或文本模式,使用`FTPClient.setFileType(FTP.BINARY_FILE_TYPE)`或`FTP.ASCII_FILE_TYPE`。 4. **上传文件**:调用`FTPClient.storeFile(String remote, ...

    sun.FtpClient,ftp4j.FTPClient,apache.FTPClient不同的方式操作FTP

    sun.net.ftp.FtpClient,it.sauronsoftware.ftp4j.FTPClient,org.apache.commons.net.ftp.FTPClient三种不同的方式操作FTP

    .NET下的FtpClient类

    因为开发一个项目要用到FTP上传功能,用的是.NET平台,当时找了半天也没有关于FTP...找了很多资料,并参考了一下Java的sun.net.FtpClient类,总算可以拿出来用,所以就迫不及待的传上来给大家共享,相对性能方面还可以。

    FtpClient写的java FTP工具

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 设置文件传输模式为二进制 } catch (IOException e) { e.printStackTrace(); } ``` 上传文件: ```java File localFile = new File("path/to/local/file"); ...

    java实现ftp的几种方式.doc

    但是需要注意的是,`sun.net.ftp` 包是 Sun JDK 的非公开 API,使用它可能存在兼容性和稳定性问题,不推荐在生产环境中使用。 2. **使用 Commons Net 库**: Apache Commons Net 是一个流行的 Java FTP 客户端库...

    apache java ftpclient

    删除文件使用`FTPClient.deleteFile()`方法,而删除目录则需先改变到该目录,然后使用`FTPClient.removeDirectory()`。 7. **被动模式与主动模式** FTP的主动模式中,服务器发起数据连接到客户端,而在被动模式下...

    Java实现文件下载并解决中文文件名乱码

    本文将详细介绍如何使用Java实现文件下载功能,并重点讲解如何解决中文文件名乱码的问题。 #### 一、基本原理与步骤 1. **读取文件**:首先需要将要下载的文件读取到内存中。 2. **设置响应头**:为了正确地告知...

    JAVA FTP实现

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 设置文件传输模式为二进制 // 文件上传 File localFile = new File("/path/to/local/file"); ftpClient.storeFile("remote/path", new FileInputStream(local...

    jdk1.7以上专用FTP工具类

    jdk1.7以上专用FTP工具类,本人花了半天时间调试通过,拿来即用,具体用法详见main函数。

    java通过ftp上传下载文件

    TestFtpUpload 为示例工程 依赖的jar 里面都有 倒入到...1. 通过sun :sun.net.ftp.FtpClient 2. 通过apache:org.apache.commons.net.ftp.FTPClient 3. 通过edtftp: com.enterprisedt.net.ftp.FileTransferClient

    ftp客户端算法+注解+代码

    在Java中,实现FTP客户端功能有多种方法,包括使用Java内置的`sun.net.ftp`包以及第三方库如Apache Commons Net等。 以下是一个简单的FTP客户端实现示例,基于Java内置的`sun.net.ftp`包: ```java import sun.net...

    使用java开发ftp参考.pdf

    Java开发FTP客户端涉及的核心知识点包括FTP协议的基本原理、FTP客户端的设计模式、以及JBuilder9中提供的FTP库——sun.net.ftp.FtpClient的使用。以下是对这些知识点的详细说明: 1. FTP协议基础: FTP(File ...

    oracle中实现ftp文件上传下载.doc

    在提供的代码示例中,可以看到使用了`sun.net.ftp.FtpClient`类来实现FTP客户端的功能。然而,值得注意的是,`sun.net.ftp.FtpClient`并不是标准的Java API,而是Oracle JRE的一个私有实现,这意味着它可能在不同的...

    JAVA程序中FTP的连接以及上传文件

    import sun.net.ftp.FtpClient; public class ftptest { FtpClient ftpClient; private String localfilename; private String remotefilename; static String a = new String(); static int b; static ...

    在JAVA应用程序中如何实现FTP的功能 (转).txt

    - 使用`sun.net.ftp.FtpClient`类创建一个FTP客户端对象,并通过调用`openServer()`方法连接到指定的服务器。 - 登录服务器,通过调用`login()`方法,传入用户名和密码。 - 如果提供了路径,则使用`cd()`方法切换到...

    java实现ftp上传下载(jdk1.7以上).docx

    本文档介绍了一种利用Java标准库中的`sun.net.ftp.FtpClient`类实现FTP上传与下载功能的方法。此方法适用于JDK版本1.7及以上的环境。 #### 代码解析 ##### 包结构与导入包 首先,定义了一个名为`com.pifeng.util`...

    javaftp实现上传下载解决编码问题.doc

    尽管`sun.net.NetworkClient`类中的`encoding`属性可以设置FTP的编码,但由于它是受保护的,无法直接访问。为了解决这个问题,我们可以创建一个自定义的`FtpClient`子类,如`CustomFtpClient`,通过继承并设置这个...

    java经典代码

    在这个特定的代码段中,开发者使用了`sun.net.ftp.*`包中的类来实现FTP客户端的功能,这是一个内部使用的非公开API,可能在不同JVM版本中不可用或不稳定。尽管如此,我们仍然可以了解这个例子的基本思路和一般Java ...

    java实现ftp的几种方式_java实现ftp的几种方式.doc

    本代码示例展示了使用 `sun.net.ftp` 包来实现 FTP 客户端功能,包括连接、断开、切换目录、创建目录、删除文件、上传文件、下载文件以及获取文件列表等操作。需要注意的是,`sun.net.ftp` 包是 Sun Microsystems ...

Global site tag (gtag.js) - Google Analytics