2012-03-02 56 views
12

ファイルをFTPサーバーにアップロードする必要があります。ファイル名には特殊文字、たとえばäöüが含まれています。 FTPサーバーでは、ファイル名をUTF-8でエンコードする必要があります。Apache Commons Net FTPClientのファイル名のエンコーディング

私のコードは次のようである:

import org.apache.commons.net.ftp.FTPClient; 

FTPClient client = new FTPClient(); 

... 

boolean retval = client.storeFile(fileName, inputStream); 

問題がstoreFile後、FTPサーバーに保存されたファイルの名前がUTF-8ではなく、エンコードされたISO-8859-1であるということです。

FTPClientにUTF-8にファイル名をエンコードする方法を教えてください。

+1

あなたが間違った場所を探していると思いますが、これはおそらくFTPサーバーの設定です。 – Marcelo

+1

必ずしもそうではありません。オリジナルのFTPプロトコル仕様は、Unicodeをまったくサポートしていませんでした。 FTP接続でUTF-8を使用するには、両方の当事者が最初にその使用に同意する必要があります。サーバは、FEATコマンドでUTF-8をサポートしていることを報告しなければなりません(RFC 2640を参照してください。一部のサーバーでは、クライアントがUTF-8を有効にするために非標準の 'OPTS UTF8 ON'または' OPTS UTF-8 NLST'コマンドを送信する必要があります。つまり、$ 1Mの質問です。「FTPClient」は何をサポートしていますか?また、サーバは何をサポートしていますか? WareSharkのようなパケットスニッファを使用してFTPトラフィックを監視してみます。 –

答えて

24

私はそれをテストしていませんが、あなたはthisを試すことができます。

client.setControlEncoding("UTF-8"); 
+5

はい、setControlEncodingが正しいです。ただし、接続する前にsetControlEncodingを呼び出すことは重要です。それ以外の場合は動作しません。私は実際にこれがライブラリの不幸なデザインの一部だと思っています。http://yaseb.wordpress.com/2012/03/07/apache-commons-unfortunate-design-of-ftpclient/も参照してください。 – gefei

6

のApache CommonsのNET 3.0 1は、FTPサーバー上のUTF-8サポートの自動検出を可能にするためにftpClient.setAutodetectUTF8(true);を使用することができますので。 setControlEncodingのように、接続する前に呼び出さなければなりません。

対応するjavadocを参照してください。

関連する問題