ApacheFTPClient请求FTP服务器中文路径

本文所使用的环境为:

  1. ftp服务器:XP系统+Server-u搭建的FtpServer;
  2. ftp客户端:XP系统+tomcat+ApacheFtpClient;

Server-u搭建的ftp服务器默认为UTF-8的编码,如果希望使用系统默认编码需要在设置中修改:百度经验修改server-u搭建的ftp服务器的编码

FtpUtil:

public class ApacheFtpUtil {
	private static ApacheFtpUtil ApacheFtpUtil = null;
	private FTPClient ftp = null;
	boolean _isLogin = false;
	//初始化方法;
	public static ApacheFtpUtil getInstance() {
        if (ApacheFtpUtil == null) {
            ApacheFtpUtil = new ApacheFtpUtil();
        }
        return ApacheFtpUtil;
    }
    private String ip;
    private int port;
    private String uname;
    private String pass;

    /**
     * ftp 匿名登录
     *
     * @param ip   ftp服务地址
     * @param port 端口号
     */
    public boolean login(String ip, int port) {
        //如果没有设置ftp用户可将username设为anonymous,密码为任意字符串
        return login(ip, port, "anonymous", "");
    }

    /**
     * ftp登录
     *
     * @param ip    ftp服务地址
     * @param port  端口号
     * @param uname 用户名
     * @param pass  密码
     */
    public boolean login(String ip, int port, String uname, String pass) {
        this.ip = ip;
        this.port = port;
        this.uname = uname;
        this.pass = pass;
        ftp = new FTPClient();
//		boolean flag=false;
        try {
            // 连接
            ftp.connect(ip, port);
            _isLogin = ftp.login(uname, pass);
            System.out.println("ftp:" + (_isLogin ? "登录成功" : "登录失败"));
            //判断是否支持utf-8,如果支持则设置连接编码为UTF-8
//            if(FTPReply.isPositiveCompletion(ftp.sendCommand("OPTS UTF-8","ON"))){
//                ftp.setControlEncoding("UTF-8");
//            }else{
            //设置连接的编码为GBK;
            ftp.setControlEncoding("GBK");
//            }
            // 检测连接是否成功
            int reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                System.err.println("FTP服务器拒绝连接 ");
                return false;
            }
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }

   /**
     * 下载文件
     *
     * @param ftpDirName        ftp目录名
     * @param ftpFileName       ftp文件名
     * @param localFileFullName 本地文件名
     * @return
     * @author xxj
     */
    public boolean downloadFile(String ftpDirName,
                                String ftpFileName, String localFileFullName) {
        if (!ftp.isConnected()) {
        //判断ftp连接是否关闭,如果关闭了则重新登陆,避免大批次的操作时出现连接中断;
            login(ip, port, uname, pass);
        }
        ftp.enterLocalPassiveMode();
        try {
            if ("".equals(ftpDirName))
                ftpDirName = "/";
//            String dir = new String(ftpDirName.getBytes("UTF-8"), "iso-8859-1");
            String dir = "";
            //判断当前是本地测试还是生产环境
            //由于我本地都是utf8的编码,而生产都是GBK所以需要进行特殊处理
            if("1".equals(PropertiesLoader.ISTEST)){
                dir = new String(ftpDirName.getBytes("UTF-8"), "ISO-8859-1");
            }else{
                dir = new String(ftpDirName.getBytes("GBK"), "ISO-8859-1");
            }
            if (!ftp.changeWorkingDirectory(dir)) {

                System.out.println("切换目录失败:" + ftpDirName);
                System.out.println("转换后路径:" + dir);
                return false;
            }
            FTPFile[] fs = ftp.listFiles();
            String fileName = "";
            if("1".equals(PropertiesLoader.ISTEST)){
                fileName = new String(ftpFileName.getBytes("UTF-8"), "iso-8859-1");
            }else{
                fileName = new String(ftpFileName.getBytes("GBK"), "ISO-8859-1");
            }
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File file = createFile(localFileFullName, true);
                    FileOutputStream is = new FileOutputStream(file);
                    ftp.retrieveFile(ff.getName(), is);
                    is.close();
                    System.out.println("下载ftp文件已下载:" + localFileFullName);
                    return true;
                }
            }
            System.out.println("下载ftp文件失败:" + ftpFileName + ";目录:" + ftpDirName);
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

个人拙见:ftp连接过程中,传输数据时会将数据转换为ISO-8859-1的字节流,所以需要事先将中文转换成ISO-8859-1的编码,同时告知ftpServer以何种格式的编码解码;(如有错误望在评论处指出,感谢!!!)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache FTPClient是一个开源的Java FTP客户端库,它可以用来连接FTP服务器并执行文件传输操作。Apache FTPClient连接FTP服务器的原理如下: 1. 创建FTPClient对象:首先,需要创建一个FTPClient对象来连接FTP服务器FTPClientApache FTPClient库提供的一个类,它提供了各种方法来连接FTP服务器、传输文件等。创建FTPClient对象的代码如下: ``` FTPClient ftpClient = new FTPClient(); ``` 2. 连接FTP服务器FTPClient对象创建后,需要使用connect方法连接FTP服务器。connect方法需要传入FTP服务器的地址和端口号。连接FTP服务器的代码如下: ``` ftpClient.connect(serverAddress, port); ``` 3. 登录FTP服务器:连接FTP服务器后,需要使用login方法登录FTP服务器。login方法需要传入FTP服务器的用户名和密码。登录FTP服务器的代码如下: ``` boolean success = ftpClient.login(username, password); ``` 4. 执行FTP操作:登录FTP服务器成功后,可以使用FTPClient对象提供的各种方法来执行FTP操作,比如上传文件、下载文件、删除文件等。FTP操作的代码如下: ``` ftpClient.changeWorkingDirectory(remoteDirectory); InputStream inputStream = new FileInputStream(localFile); ftpClient.storeFile(remoteFile, inputStream); inputStream.close(); ``` 5. 断开FTP连接:FTP操作完成后,需要使用disconnect方法断开FTP连接。断开FTP连接的代码如下: ``` ftpClient.disconnect(); ``` 以上就是Apache FTPClient连接FTP服务器的原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值