问题触发环境
1. java中使用org.apache.commons.net.ftp.FTPClient包
2. 通过chrome浏览器的file标签上传文件
3. 在windows上部署的FileZilla服务上传的文件名正常显示,在linux上的vsftpd服务文件名显示乱码
4. 直接chrome浏览器访问linux的ftp目录(chrome的默认编码是UTF-8),正常显示
5. 乱码出现后,尝试了各种方式编码处理,造成了环境的各种不可追溯
解决过程
1. 查询资料:FTP协议规定文件名编码为iso-8859-1,所以上传的文件目录或文件名需要转码
2. 参考FileZilla的流程,会向FTP服务器发送OPTS UTF8 ON命令,开启服务器对UTF-8的支持。
3. 仿照FileZilla的方式,可向服务器发送该指令,如果服务器支持UTF-8则使用UTF-8,否则使用本地编码(GBK)处理中文名
4. 起作用的java关键代码
private static String LOCAL_CHARSET = "GBK";

// FTP协议中规定的文件名编码为: iso-8859-1
private static String FTP_CHARSET = "ISO-8859-1"; ...
if (ftpClient.login(user, pwd)) {
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8,否则使用本地编码(GBK)
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
// 设置被动模式
ftpClient.setLocalPassiveMode();
...
} ftpClient.changeWorkingDirectory(encodingServerPath(remotePath)) // 上传的时候使用
ftpClient.storeFile(encodingServerPath(fileName), inputStream); /**
* 编码文件路径
*/
private static String encodingServerPath(String path) throws UnsupportedEncodingException {
// FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码,replace处理文件路径
return new String(path.replace("\\", "/").replaceAll("//", "/").getBytes(LOCAL_CHARSET), FTP_CHARSET);
} // 下载的时候使用
ftpClient.retrieveFile(encodingServerPath(fileName), outputStream); // 打印ftp工作目录时需要切换转码
System.out.println("当前工作目录:"+ new String(ftp.printWorkingDirectory().getBytes(FTP_CHARSET), LOCAL_CHARSET));
个人理解的转码和解码过程如下:
filePath 的原始编码: origin_charset => start
java后台: new String(filePath.getBytes(Local_CHARSET), "ISO-8859-1") => step_1
FTP Protocol: new String(filePath.getBytes("ISO-8859-1"), FTP_CHARSET) => step_2
FTP 服务器的默认编码: new String(filePath.getBytes(FTP_CHARSET), server_charset) => end
if(Local_CHARSET == FTP_CHARSET) upload正常, else upload异常(无法创建和切换目录)
if(origin_charset == server_charset) 文件名在FTP服务器上显示正常, else 文件在FTP服务器显示乱码,download异常
如果filePath的编码与上传时的编码不一致,download异常
web项目开发中出现乱码,要从传值开始分析编码,逐步排查,确保编码一致。要注意浏览器和某些方法的默认行为(场景较多,需要时查询即可,不在此处罗列)

测试后的代码托管在GitHub中,地址https://github.com/Hlingoes/file-message-server,位于application/FtpService中,供参考和提出改进建议

linux中ftp中文名乱码问题的更多相关文章

  1. Windows转到linux中,文件乱码,文件编码转换 & 解决sqlplus连接oracle乱码

    转载:http://www.cnblogs.com/wanyao/p/3399269.html 最近,学习又重新开始Linux学习,所以一直在Centos中,昨天一朋友把他在Windows下写的C程序 ...

  2. Linux中ftp不能上传文件/目录的解决办法

    在linux中不能上传文件或文件夹最多的问题就是权限问题,但有时也不一定是权限问题了,像我就是空间不够用了,下面我来总结一些ftp不能上传文件/目录的解决办法   在排除用户组和权限等问题后,最可能引 ...

  3. Windows转到linux中,文件乱码,文件编码转换

    最近,学习又重新开始Linux学习,所以一直在Centos中,昨天一朋友把他在Windows下写的C程序发给我,我欣然答应,本以为很快就能在我的Linux系统中运行起来.没想到出现了乱码,结果想把这个 ...

  4. linux中FTP自动备份VPS脚本

    服务器多了,网站也越来越多,总觉得不整个备份心里放不下心,并且有好几次rm的操作失误,造成难以挽回的损失.并且大多数的VPS提供商是不提供自动备份功能或者此功能收费价格略高.所以自己还是有必要把这个工 ...

  5. Linux 中 Windows 中文乱码

    Linux 下 Windows 源代码中文乱码 由于 windows 和 linux 对文本的编码方式不同,所以经常会有 windows 中生成的文本在 linux 中打开乱码的情况. 比如: 我面临 ...

  6. Linux中重命名乱码文件

    Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ...

  7. Linux中ftp服务器搭建

    一.FTP工作原理 (1)FTP使用端口 [root@localhost ~]# cat /etc/services | grep ftp ftp-data 20/tcp #数据链路:端口20 ftp ...

  8. Linux中ftp的常用命令

    转自:https://www.jb51.net/article/103904.htm FTP命令 ftp> ascii # 设定以ASCII方式传送文件(缺省值) ftp> bell # ...

  9. Linux中FTP远程传输,SSH远程连接,以及SCP远程拷贝

    常用服务器ftp.ssh 1. Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于 ...

随机推荐

  1. Power Tower

    题目大意:给出一段长为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\) ,一个模数 \(m\) .每次询问给定 \(l,r\) 求 \(a_l^{{a_{l+1}^\cdots}^{ ...

  2. Ubuntu Vi指令

    Ubuntu在不更新源的情况下是没办法使用Vim指令的只能使用Vi指令 所有我也就记录了下来 vi / vim命令: 插入内容: i: 插入光标前一个字符 I: 插入行首 a: 插入光标后一个字符 A ...

  3. MFC 屏蔽esc跟enter键

    BOOL CMenuOperate::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN && pMs ...

  4. 算法5:队列——解密 QQ 号

    新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问 QQ 号,小哈当然不会直接告诉小哼啦,原因嘛你懂的.所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则.规则是这样的 ...

  5. 十、CI框架之通过参数的办法输出URI路径

    一.代码如下,index函数有2个参数 二.效果如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  6. 51nod1414 冰雕(暴力枚举)

    题目是这样的: 1414 冰雕 白兰大学正在准备庆祝成立256周年.特别任命副校长来准备校园的装扮. 校园的中心竖立着n个冰雕.这些雕像被排在一个等分圆上,因此他们形成了一个正n多边形.这些冰雕被顺针 ...

  7. @SpringBootApplication-exclude和扫描并装配其他包下的bean(@AliasFor)

    1.exclude 不装配指定bean @SpringBootApplication(exclude={com.ebc.User.class}) 2.scanBasePackages package ...

  8. springboot-jar

    预览 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  9. spring_mybatis :整合

    第一步:导入相关架包(使用maven构建项目) 在pom.xml文件中导入相关依赖 1.Junit测试架包 <dependency> <groupId>junit</gr ...

  10. ArchLinux安装(BIOS)

    ArchLinux安装(BIOS) 说在前头:在经历过无数次的失败尝试过后总结出的可用的安装过程(比官方的简单一点) 官方安装指导 一.连接网络 1.连接 # wifi-menu 2.检查是否联通 ( ...