在Camel中使用FTP只需要簡單的DSL配置就可以了,把對應的jar放到classpath即可,但是在使用中遇到了FTP服務器上中文目錄的問題,如果FTP服務器上的目錄是中文的,那么FTP執行什么信息都沒有,也沒有錯誤,也沒有下載下來。搞得我有些莫名其妙,不知道到底是怎么回事。
后來開始跟蹤Camel源代碼進行debug,終於發現在org.apache.camel.component.file.remote.FtpOperations類的doChangeDirectory方法中,無法進入到對應的中文目錄。
1 private void doChangeDirectory(String path) { 2 if (path == null || ".".equals(path) || ObjectHelper.isEmpty(path)) { 3 return; 4 } 5 6 log.trace("Changing directory: {}", path); 7 boolean success; 8 try { 9 if ("..".equals(path)) { 10 changeToParentDirectory(); 11 success = true; 12 } else { 13 success = client.changeWorkingDirectory(path); 14 } 15 } catch (IOException e) { 16 throw new GenericFileOperationFailedException(client.getReplyCode(), client.getReplyString(), e.getMessage(), e); 17 } 18 if (!success) { 19 throw new GenericFileOperationFailedException(client.getReplyCode(), client.getReplyString(), "Cannot change directory to: " + path); 20 } 21 }
關鍵就在第13行client.changeWorkingDirectory的方法,而這個client是用的org.apache.commons.net.ftp.FTPClient,上網查找了一下,發現很多人都遇到了FTPClient不能進入中文目錄的問題。
嘗試了三種方法:
第一種改變編碼,不行,還是不能進入目錄。
uri = new String(uri.getBytes("gb2312"),"iso-8859-1");
第二種方法,設置表頭的編碼,還是不行。
.process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.setProperty(Exchange.CHARSET_NAME, "gb2312"); } })
第三種方法,設置FTPClient的編碼,這個終於OK了,關鍵就在最后的紅字,ftpClient.controlEncoding=gb2312
String uri = "ftp://username@10.10.XX4.122/中文目錄?password=xxxx&ftpClient.controlEncoding=gb2312";
