日期:2014-05-17 浏览次数:20955 次
try {
         int reply;
         ftp.connect(ip, port);
         //下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
         ftp.setControlEncoding("GBK");
         FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
         conf.setServerLanguageCode("zh");
         //如果采用默认端口,可以使用ftp.connect(url) 的方式直接连接FTP服务器
         ftp.login(username, password);//登录
         reply = ftp.getReplyCode();
         if (!FTPReply.isPositiveCompletion(reply)) {
             ftp.disconnect();
             return success;
         }
         //ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
         chgDir=ftp.changeWorkingDirectory(new String(remotePath.getBytes(),"ISO-8859-1"));
         if (chgDir) {
             FTPFile[] fs = ftp.listFiles();
             for (int i = 0; i < fs.length; i++) {
                 FTPFile ff = fs[i];
                 if (ff.getName().equals(fileName)) {
                     File localFile = new File(localPath + File.separator + ff.getName());
                     OutputStream is = new FileOutputStream(localFile);
                     //注意此处retrieveFile的第一个参数由GBK转为ISO-8859-1编码。否则下载后的文件内容为空。
                     //原因可能是由于aix系统默认的编码为ISO-8859-1
                     ftp.retrieveFile(new String(ff.getName().getBytes("GBK"), "ISO-8859-1"), is);
                     is.close();
                 }
             }
         }
         ftp.logout();
         success = true;
     } catch (IOException e) {
         e.printStackTrace();
     } finally {
         if (ftp.isConnected()) {
             try {
                 ftp.disconnect();
             } catch (IOException ioe) {
             }
         }
     }
------解决方案--------------------
1.首先apache-FtpServer 默认使用的是utf-8,  查看FtpServerProtocolCodecFactory源码可知 可知它的encode,decode 都是使用的是utf-8.
2.ftp命令走的是control connection, 所以客户端要使用 ftpClient.setControlEncoding("UTF-8");