FtpClient在创建中文目录文件名中的中文显示乱码解决方法

最近在做文件服务器的相关东西,在原有的磁盘存储的基础上,增加了Ftp的存储方式,客户端选用的是Apache的FtpClient。 今天在测试的时候,发现中文的路径后者文件名不支持,查阅了相关资料后终于找到了解决的方法。

使用类:

org.apache.commons.net.ftp.FTPClient

问题描述:

创建中文目录、上传中文文件名时,目录名及文件名中的中文显示乱码解决方法:

在网上Google了一些资料, FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。

所以网上很多人的解决方法为:

将中文的目录或文件名转为iso-8859-1编码的字符。参考代码:

String name="目录名或文件名";

name=new String(name.getBytes("GBK"),"iso-8859-1");很多人改为上述操作后,发现上传后中文不再乱码了,就以为解决了问题还有人处理方法为:

ftpClient.setControlEncoding("GBK");

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);conf.setServerLanguageCode("zh");

上述的处理方法,我都试过,发现在我自己搭建的FTP服务器上,上传的文件中文是正常的,不是乱码,我当时以为中文问题就解决了,但是测试部的同事在将文件上传到他们搭建的FTP服务器上时,文件中文路径仍然是乱码,所以上述的解决方法是错误的。

上面的方法之所以错误的原因是因为是没有考虑ftp服务器的编码格式。我搭建的Ftp服务器(windows2003 server)支持GBK编码方式,所以上述的解决方法可以,但是测试部的同事搭建的Ftp服务器(serv-u)是支持UTF-8格式的,所以此时在客户端的编码方式是GBK的,而搭设的ftp服务器中的设置就已经是utf-8的编码,所以肯定还是会出现乱码的问题。

那么正确的解决方法时是什么呢,我们可以仿照FlashFXP、FileZilla等ftp 客户端连接工具,看看他们是如何实现的,下面的两张图就是FileZilla的配置信息和连接时的命令信息。

图1:FileZilla配置信息

图2:FileZilla连接时信息

从图2中我们可以看到原来它向服务器发送了OPTS UTF8 ON命令,来开启服务器对UTF-8的支持。所以我们也可以仿照FileZilla那样向服务器发送该命令。如果服务器支持UTF-8我们就用UTTF-8,否则我们就用本地编码(GBK)来处理中文文件名。

下面是Java代码:

/** 本地字符编码 */

private static String LOCAL_CHARSET = "GBK";// FTP协议里面,规定文件名编码为iso-8859-1private static String SERVER_CHARSET = "ISO-8859-1";private void connectFtpServer() {

if (ftpClient == null) {

ftpClient = new FTPClient();

}

if (ftpClient.isConnected()) {

return;

}

String host = getConfigValue(ADDRESS);

int port = Integer.valueOf(getConfigValue(PORT));String user = getConfigValue(USER);

String password = getConfigValue(PASSWORD);try {

ftpClient.connect(host, port);

if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {if (ftpClient.login(user, password)) {

if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).

LOCAL_CHARSET = "UTF-8";

}

ftpClient.setControlEncoding(LOCAL_CHARSET);ftpClient.enterLocalPassiveMode();// 设置被动模式ftpClient.setFileType(getTransforModule());// 设置传输的模式return;

} else {

throw new FileStorageException(

"Connet ftpServer error! Please check user or password");}

}

} catch (IOException e) {

disConnectServer();

throw new FileStorageException(

"Connet ftpServer error! Please check the Configuration");}

}

上传文件时,文件名称需要做编码转换

fileName = new String(fileName.getBytes(LOCAL_CHARSET),SERVER_CHARSET);

通过上述方法,就能解决了中文乱码的问题。谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。

(0)

相关推荐

  • pr添加中文字幕显示乱码解决方法

    小编致力于为大家奉献最有效的,让大家能够解决掉问题,但是大家也都知道,每个人遇到的情况都是不一样的,大家在看小编的同时,除了跟随操作,也需要自己的思考,举一反三的解决问题,这样才会变得更加有内涵,成为 ...

  • 迅雷文件名中包含违规内容破解决方法

    当迅雷下载提示文件中包含违规内容,无法添加到高速通道和离线空间的时候,我们还是有解决办法的.以前可以通过更改文件名方式来解决,现在已被查封,那么我们就换种方法. 操作方法 01 在迅雷中右键点击所下载 ...

  • Steam 音乐 music 播放器 中文显示乱码解决方法

    Steam新出的音乐播放器在游戏中播放很方便,再也不用切出游戏了.不过播放器还有点问题:自己胡乱试着发现了解决乱码办法,分享下~ 操作方法 01 首先,右键音乐文件的属性 02 把"标题&q ...

  • 解决win7系统所有中文显示乱码的方法教程

    在win7系统下我们如果把语言操作系统界面语言修改为英文后,有部分用户的电脑中的英文字体将显示乱码的问题,对于出现该问题是因为中文不是Unicode语言,用户在将系统语言设置为英文后,语言设置的非Un ...

  • 不小心禁用了所有用户账号怎么办?Win7中禁用了所有用户账号解决方法

    在使用Win7系统时,为了方便我们会创建多个账号来使用,有时会不经意间禁用了所有的用户账号,导致开机时所有用户账号都不能使用,遇到这样的状况我们要如何处理呢,下面由小编来给大家讲解Win7系统不小心禁 ...

  • SecureCRT8.0汉化安装破解详细图文教程、中文乱码解决方法(附注册机)

    securecrt8.0破解版是一个终端仿真程序,该程序可以让你在windows系统中登陆UNIX或Linux的服务器主机并实现管理设置,十分的强大.在最新的8.0版本中,软件已经可以支持包括SSH2 ...

  • 在Excel中的数字前输入0却不能显示的解决方法

    Microsoft Excel 可谓是大家公认的简单易用地电子表格处理软件,在用Excel处理数据时,有时需要在数字前输入0,如"0001".但输入完后,前面的0却不显示出来,只显 ...

  • win7在"我的电脑"中无法看到摄像头的解决方法

    在本文中我们将会看到的是在win7下“我的电脑”中无法看到摄像头的解决方法! 问:我刚买的笔记本装的是32位的Windows 7旗舰版。技术员说在Win 7系统“我的电脑”中无法看到摄像头,只有开QQ ...

  • Word2007中鼠标失灵的故障解决方法

    Word2007中鼠标失灵的故障解决方法.相信很多朋友在工作中编辑文档的时候都是用Offcie套件中的word编辑的,不知道大家有没有遇到过这种情况,那就是当我们在编辑Word文章时,鼠标莫名其妙的失 ...