`

commons net 下的FTPClient使用时的一些小问题

阅读更多

原始发表时间:2009-08-20

 

    FTPClient上传文件时,必须先关闭在服务器上打开的输出流对象,而后再等待命令结束后登出,否则会丢失文件的最后部分。
    另外,想避免乱码,得用FTPClient 的 setControlEncoding 方法来设置编码,不过这仅仅是针对文件内容而言,传输的文件名称如果有中文的话,还是得进行转码。
    下面黑体字 标识了这些需要注意的关键点相关的代码。

参考文章
http://blog.csdn.net/wangjian5748/archive/2008/11/28/3404619.aspx


得到的最终可用的正确代码如下:
        FTPClient ftpclient = new FTPClient();
        try {
            listener.setProgress(TOTAL, 1, "连接 FTP...");
            ftpclient.connect(...);
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            listener.setProgress(TOTAL, 2, "登录 FTP...");
            ftpclient.login(...);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ftpclient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
            ftpclient.setControlEncoding("GBK");
            listener.setProgress(TOTAL, 3, "检测 FTP 目录...");
            String submitdatadir = ...;
            ftpclient.changeWorkingDirectory(submitdatadir);
            listener.setProgress(TOTAL, 4, "传输文件...");
            OutputStream output = ftpclient.storeFileStream(new String(submitDataFileName.getBytes("GBK"), "iso8859-1") );
            if (output == null) {
                log.debug("ReplyCode:" + ftpclient.getReplyCode());
            }
            String submitDataFileLocalPath = submitDataFileLocalDir + File.separatorChar + submitDataFileLocalName;
            InputStream input = new FileInputStream(submitDataFileLocalPath);
            int totalsize = input.available();
            log.debug("totalsize : " + totalsize);
            byte[] buffer = new byte[1024];
            int count = 0;
            int n = 0;
            while (-1 != (n = input.read(buffer))) {
                output.write(buffer, 0, n);
                count += n;
                log.debug("count: " + count);
                listener.setProgress(TOTAL, 5, "传输文件,已传输 " + (count * 100 / totalsize) + "% ...");
            }
            output.close();
            input.close();
            if (ftpclient.completePendingCommand()) {
                log.debug("logout: " + ftpclient.logout());
                ftpclient.disconnect();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

分享到:
评论
4 楼 gkbusy 2011-02-01  
zhouxianglh 写道
 OutputStream output = ftpclient.storeFileStream(new String(submitDataFileName.getBytes("GBK"), "iso8859-1") );

偶尔会返回null,是怎么回事哦


看了一下FTPClient的源代码,可能是在调用 _openDataConnection_ 方法返回了空值,是不是打开数据连接的时候,FTP服务器的连接短暂的超时了?

这个问题的发生频率高么?
3 楼 zhouxianglh 2011-01-18  
 OutputStream output = ftpclient.storeFileStream(new String(submitDataFileName.getBytes("GBK"), "iso8859-1") );

偶尔会返回null,是怎么回事哦
2 楼 gkbusy 2010-06-14  

很高兴能解决你遇到的问题,要是有空你也可以研究一下源码,为什么会有转码的要求,再写一篇更原理性的博客,说不定能给更多人带来启发
1 楼 xvm03 2010-06-09  
解决了困扰我一个上午的问题,我说怎么传中文名称都是乱码,原来必须要转码

相关推荐

    用org.apache.commons.net.ftp.FTPClient包实现简单文件下载

    在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。这个过程涉及到几个关键步骤,包括连接到FTP服务器、登录、设置传输模式、下载文件以及断开连接。 首先,你...

    org.apache.commons.net.ftp.FTPClient包

    org.apache.commons.net.ftp.FTPClient包,不错,在实际项目和产品中使用过。

    Apache Commons Net » 3.3 org.apache.commons.net.ftp.FTPClient

    在实际开发中,使用FTPClient时,通常需要先建立连接,登录,设置模式,然后执行文件操作,最后记得断开连接。开发者还需要处理可能出现的异常,确保程序的健壮性。此外,根据实际需求,可能还需要设置SSL/TLS加密,...

    使用FTPClient实现ftp文件上传

    在本文中,我们将深入探讨如何使用FTPClient来实现FTP文件上传,特别是处理中文文件名的上传问题。 FTP是一种广泛使用的互联网协议,允许用户在两台计算机之间传输文件。在Java中,我们可以利用Apache Commons Net...

    commons-ftp中ftpClient类的API

    `FTPClient`类位于`org.apache.commons.net.ftp`包下,继承自`FTP`类,并实现了`Configurable`接口。这表明`FTPClient`类不仅可以进行FTP操作,还可以被配置。 - **父类**:`FTP` - **实现的接口**:`Configurable`...

    FtpClient commons-net-3.6.jar

    Java代码连接FTP并且实现文件的上传和下载需要的jar文件。

    apache FTPClient commons-net-3.5-src.rar

    Apache FTPClient是Apache Commons Net库中的一个组件,用于在Java应用程序中实现FTP(文件传输协议)客户端的功能。这个源码库,"commons-net-3.5-src.rar",提供了FTPClient的完整源代码,让我们可以深入理解其...

    commons-ftp中ftpClient类的API.pdf

    根据提供的文件信息,可以看出文档的主题是关于commons-ftp库中的FTPClient类的API使用指南。commons-ftp是一个Java开源库,用于在应用程序中实现FTP协议的相关操作,如文件上传、下载、删除等。FTPClient是这个库中...

    commons-ftp中ftpClient类的API--.doc

    在使用`FTPClient`时,首先要通过`connect`方法连接到FTP服务器,然后检查`getReplyCode`返回的响应代码以确认连接是否成功。例如: ```java FTPClient ftp = new FTPClient(); try { ftp.connect("ftp.foobar....

    FTPCLIENT_commons-net-1.4.1_jakarta-oro-2.0.8

    本文将深入探讨使用Java实现FTP客户端时,如何利用`commons-net-1.4.1.jar`和`jakarta-oro-2.0.8.jar`这两个关键库来实现文件的上传和下载功能。 `commons-net-1.4.1.jar`是Apache Commons Net库的一个版本,它提供...

    org.apache.commons.net.ftp.FTPClient jar包

    FTP应用的jar包,主要用于java开发FTP上传下载

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

    在本文中,我们将深入探讨如何使用Apache Commons Net库和Java内置的`sun.net.ftp.FtpClient`来实现FTP(文件传输协议)的功能,包括上传、下载、批量操作以及删除文件。这两个库提供了丰富的API,使得在Java应用...

    commons-net-3.6.jar

    Apache Commons Net的FTPClient支持被动模式,通过设置passiveMode(),客户端能在服务器指定的端口上建立数据连接,解决此类网络问题。 五、源码解析 深入学习`commons-net-3.6.jar`的源码,可以帮助开发者理解FTP...

    FTPClient所需jar包以及上传样例代码,commons net 3.6

    JAVA操作ftp服务器,FTPClient所需要的jar包,版本号3.6,截止到2018-11-27是最新版本。里面有一个本人自己写的样例,没有工厂类等其他方法,直接一个主函数下来,简单粗暴易懂。如果需要官方提供的源码以及样例,请...

    commons-net-jar包.zip

    Commons Net还包含了一些日期和时间的处理工具,如InternetDateFormat类,可以按照RFC822和RFC1123标准格式化日期,这在处理HTTP头部或电子邮件时非常有用。 7. **版本差异** 从3.3升级到3.4,主要的改进可能包括...

    org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能

    org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能

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

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

    Apache的FTPClient.jar

    在使用Apache Commons Net的FTPClient时,要注意异常处理,如`FTPReply.isPositiveCompletion(reply)`检查FTP命令是否成功,以及在每次操作后检查连接状态。此外,为了保持良好的网络礼仪,记得在操作完成后关闭打开...

Global site tag (gtag.js) - Google Analytics