ie apache ftpserver 奇数个汉字问题

ie无法上传文件名为奇数个汉字的文件

在UTF-8编码下,每个汉字被分配为3个字节存储。当我们通过GET方式请求奇数个汉字,或者直接读取存储在Cookies中的奇数个汉字时,IE的HTML解析引擎“自作主张”的将汉字(亦称“全角字符”)的高位截掉,最后作为两个字节显示出来。很显然,按照这个思路,这奇数个字的第三个字信息是不完整的,也就出现了上面第三个字乱码的情况。
只要是偶数个字则均可正常显示,只要是奇数个字则最后一个字符必定乱码。

修改字符集
org.apache.ftpserver.command.impl.OPTS_UTF8

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));

注意:在这里,IE会忽略了202回复并继续以utf8模式处理服务器发送的ANSI数据。
解决办法是把回复代码改为502或504。
[url]http://topic.csdn.net/t/20040422/18/2997663.html[/url]



org.apache.ftpserver.listener.nio.FtpServerProtocolCodecFactory
private ProtocolDecoder decoder = new TextLineDecoder(Charset
.forName("UTF-8"));

改为:

private ProtocolDecoder decoder = new TextLineDecoder(Charset
.forName("GBK"));




org.apache.ftpserver.IODataConnection
writer = new OutputStreamWriter(out, "UTF-8");

改为:

writer = new OutputStreamWriter(out, "GBK");


大功告成。


另外如果FtpReply有中文会出现乱码

org.apache.ftpserver.listener.nio.FtpResponseEncoder
private static final CharsetEncoder ENCODER = Charset.forName("UTF-8")
.newEncoder();

改为:

private static final CharsetEncoder ENCODER = Charset.forName("GBK")
.newEncoder();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache FtpServer是一个开源的、灵活的、可扩展的FTP服务器软件,可以用Java语言编写,支持多种操作系统平台。在Apache FtpServer中,可以通过实现FTP文件传输监听器来获取上传和下载文件的进度。 下面是一个获取上传进度的示例代码: ```java public class MyFtpListener implements FtpFileUploadListener { private long totalBytes = 0L; private long transferredBytes = 0L; private FtpIoSession ftpSession; public MyFtpListener(FtpIoSession ftpSession) { this.ftpSession = ftpSession; } public void fileUploadStarted(FtpIoSession session, FtpFileUploadRequest request) { totalBytes = request.getFileItem().getSize(); transferredBytes = 0L; } public void fileUploadProgress(FtpIoSession session, FtpFileUploadRequest request, long transferredBytes) { this.transferredBytes = transferredBytes; float progress = (float)transferredBytes / (float)totalBytes * 100.0f; ftpSession.write(new DefaultFtpReply(FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, String.format("%.2f%%", progress))); } public void fileUploadFinished(FtpIoSession session, FtpFileUploadRequest request) { ftpSession.write(new DefaultFtpReply(FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "Upload finished.")); } //省略其它方法... } ``` 在上面的代码中,我们实现了FtpFileUploadListener接口,重写了fileUploadStarted、fileUploadProgress和fileUploadFinished三个方法,其中fileUploadProgress方法用于获取上传文件的进度信息,通过FTP会话对象ftpSession将进度信息发送给客户端。 在实际使用中,我们可以通过配置FTP服务器的监听器来注册上面的MyFtpListener,如下所示: ```java listenerFactory.setFtpFileUploadListener(new MyFtpListener(session)); ``` 这样,在客户端上传文件时,就可以实时获取上传进度信息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值