关于用FTPClient资源库上传下载以中文命名的文件的问题

环境描述:

1.服务端:采用serv-u11.3版本的服务器管理工具作为ftp服务端

2.客户端:采用FTPClient 1.4.1组件作为客户端访问ftp服务器


我们在用FTPClient组件上传文件时,当上传的文件名为中文时,有以下几种情况:

一、当没有禁用serv-u服务端工具的上传下载编码时,即:

没有将域限制和设置里默认的opts-utf8禁止,在:域限制和设置---FTP设置选项卡---全局属性---高级选项---第三个多选框。

1.客户端代码中如果编码为:UTF-8,那么完全没有问题,中文命名的文件可以正常上传;参考以下代码:

/** 
     * FTP上传单个文件测试 
     */ 
    public static void testUpload() { 
        FTPClient ftpClient = new FTPClient(); 
        FileInputStream fis = null; 


        try { 
            ftpClient.connect("此处填写服务器IP"); 
            ftpClient.login("用户名", "密码"); 


            File srcFile = new File("F:\\路由器配置.txt"); 
            fis = new FileInputStream(srcFile); 
            //设置上传目录 
            ftpClient.changeWorkingDirectory("/admin/pic"); 
            ftpClient.setBufferSize(1024); 
            ftpClient.setControlEncoding("UTF-8");//这里设置编码
            //设置文件类型(二进制) 
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 
            boolean temp = ftpClient.storeFile(new String("路由器配置.txt".getBytes("UTF-8"),"iso-8859-1"), fis);//编码转换
            System.out.println("temp-------"+temp);
        } catch (IOException e) { 
            e.printStackTrace(); 
            throw new RuntimeException("FTP客户端出错!", e); 
        } finally { 
            IOUtils.closeQuietly(fis); 
            try { 
                ftpClient.disconnect(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
                throw new RuntimeException("关闭FTP连接发生异常!", e); 
            } 
        } 
    } 

2.客户端代码中如果编码为:GB2312,可以上传,但是上传的文件名为乱码,代码同上,改变红颜色的字的编码为GB2312即可;


二、一、当不选serv-u服务端工具的上传下载的默认编码时,即:

在:域限制和设置---FTP设置选项卡---全局属性---高级选项---第三个多选框不要勾选时;

1.客户端代码中如果编码为:UTF-8,文件不能上传,代码中,temp变量为false;

2.客户端代码中如果编码为:GB2312,文件正常上传,并且不为乱码,代码中,temp变量为true;


综合上述:将ftp服务器默认编码禁用,并且客户端代码中以GB2312 编码上传并转化较为合理,解决中文文件名的问题;另外,还有多种情况没有举例,大家可以测试一下,以便了解更为透彻。

下图为:服务端设置:

关于用FTPClient资源库上传下载以中文命名的文件的问题_第1张图片

你可能感兴趣的:(ftp服务器)