| Apache Ftp Server,目前是1.0.4,非常好的纯Java Ftp服务器,既可以直接提供FTP服务,有可以嵌入到程序里。 如果Ftp服务器提供的内容,有中文目录,文件名,XP下IE访问会出现一些错误。
 如果IE的选项->高级里 为Ftp站点启用文件夹视图选项
 没有选中,这时显示的是Html页面,但中文显示是乱码,强行指定编码为Utf8,则显示正常,但无法下载;
 该选项选中,这时是文件夹方式显示Ftp服务器内容,选中文件夹后右键复制到文件夹,会复制出错,但用复制,然后粘贴到指定位置的方式可以正常复制。
 使用windows带的ftp.exe访问站点,遇到中文也会出现错误。
 但如果用流行的ftp客户端,比如FlashFXP就一切正常。
 这说明XP 下IE的Ftp支持有bug。
 但用户一般不用Ftp客户端,为了迁就IE,只有对ApacheFtpServer修改,通过查资料,XP下用的编码是GBK,只要把Apache FtpServer代码中处理编码的地方由国际标准UTF8编码改为迁就Xp下IE的GBK编码即可完成。
 
 具体修改
 org.apache.ftpserver.command.impl包里OPTS_UTF8.java
 将
 session.write(LocalizedFtpReply.translate(session, request, context, FtpReply.REPLY_200_COMMAND_OKAY, "OPTS.UTF8", null));
 改为
 session.write(LocalizedFtpReply.translate(session, request, context, FtpReply.REPLY_502_COMMAND_NOT_IMPLEMENTED, "OPTS.UTF8", null));
 
 org.apache.ftpserver.listener.nio包里FtpServerProtocolCodecFactory.java
 将
 new TextLineDecoder(Charset.forName("UTF-8"));
 改为:
 new TextLineDecoder(Charset.forName("GBK"));
 
 org.apache.ftpserver.impl包里IODataConnection.java
 将
 writer = new OutputStreamWriter(out, "UTF-8");
 改为:
 writer = new OutputStreamWriter(out, "GBK");
 
 org.apache.ftpserver.listener.nio包里FtpResponseEncoder.java
 将
 Charset.forName("UTF-8").newEncoder();
 改为:
 Charset.forName("GBK").newEncoder();
 
 重编译后,手动替换class就可以,如果用mvn package,test过不了,只有将出错的test文件DecoderTest和I18NTest删除,再package。
 然后IE两种方式都可以正确的访问FTP服务器中的中文资源了。
 |