jsch上传的文件文件名乱码解决方案

本文介绍了解决JSch SFTP客户端在特定版本下无法设置非UTF8编码的问题,通过反射机制修改默认server_version值实现GBK编码的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当使用jsch设置编码格式时

sftp.setFilenameEncoding("GBK"); 

出现如下错误:The encoding can not be changed for this sftp server。

使用的jar包是:jsch-0.1.54,经查看源码发现,版本是3-5的,都不支持设置文件名编码格式。

public void setFilenameEncoding(String encoding) throws SftpException{
    int sversion=getServerVersion();
    if(3 <= sversion && sversion <= 5 &&
       !encoding.equals(UTF8)){
      throw new SftpException(SSH_FX_FAILURE,
                              "The encoding can not be changed for this sftp server.");
    }
    if(encoding.equals(UTF8)){
      encoding=UTF8;
    }
    fEncoding=encoding;
    fEncoding_is_utf8=fEncoding.equals(UTF8);
  }

解决方式:使用反射修改server_version的默认值即可。

JSch jsch = new JSch();

jsch.addIdentity("provateKey");

Session session = jsch.getSession("userName", "serverIp",“port”);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
ChannelSftp channelSftp = (ChannelSftp)session.openChannel("sftp");
channelSftp.connect();

Class cl = channelSftp.class;

Field f1 =cl.getDeclaredField("server_version");
f1.setAccessible(true);
f1.set(sftp, 2); 
channelSftp.setFilenameEncoding("gbk");

其中Field是引用java.lang.reflect.Field jar包里面的类。

这样就ok了,如果想知道自己使用的jar版本是多少,可以使用getServerVersion方法来获取。具体方法如下:

channelSftp.getServerVersion().

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值