ftp文件上传,中文文件名乱码问题

young 895 2022-05-19

前提:Java代码的编码为GBK,数据库编码也为GBK

原因:

FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。

解决方法

  1. 将中文的目录或文件名转为iso-8859-1编码的字符
  2. 设置linux环境变量

controlEncoding:Java代码中,文件上传/下载前的编码配置------------------------------保证ftp服务器编码 和 ftp上传/下载时controlEncoding编码一致

export LC_ALL=zh_CN.contrlEncoding
export LANG=zh_CN.controlEncoding

ftp服务器,文件上传/下载前设置的setControlEncoding,文件上传/下载前文件名fileName 3类编码格式

文件上传:

** FTP ** ** ControlEncoding ** ** fileName ** ** 结果 **
UTF-8 UTF-8 乱码
UTF-8 UTF-8 fileName.getBytes(“GBK”),“iso-8859-1”
由GBK转为iso-8859-1编码
乱码
UTF-8 UTF-8 fileName.getBytes(“UTF8”),“iso-8859-1”
由UTF-8转为iso-8859-1编码
正常
GBK GBK 乱码
GBK GBK fileName.getBytes(“UTF-8”),“iso-8859-1”
由UTF-8转为iso-8859-1编码
乱码
GBK GBK fileName.getBytes(“GBK”),“iso-8859-1”
由GBK转为iso-8859-1编码
正常

文件下载: 根据文件名,从ftp服务器上获取文件

** FTP ** ** ControlEncoding ** ** fileName ** ** 结果 **
UTF-8 UTF-8 乱码
UTF-8 UTF-8 fileName.getBytes(“GBK”),“iso-8859-1”
由GBK转为iso-8859-1编码
乱码
UTF-8 UTF-8 fileName.getBytes(“UTF8”),“iso-8859-1”
由UTF-8转为iso-8859-1编码
正常
GBK GBK 乱码
GBK GBK fileName.getBytes(“UTF-8”),“iso-8859-1”
由UTF-8转为iso-8859-1编码
乱码
GBK GBK fileName.getBytes(“GBK”),“iso-8859-1”
由GBK转为iso-8859-1编码
正常