jsch上傳的文件文件名亂碼解決方案

當使用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().

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章