2012-03-02 9 views
12

Tengo que subir un archivo a un servidor FTP. El nombre del archivo contiene letras especiales, digamos äöü. En el servidor FTP, necesito que el nombre del archivo sea UTF-8 codificado.Codificación de nombre de archivo en Apache Commons Net FTPClient

Mi código es así:

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

FTPClient client = new FTPClient(); 

... 

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

El problema es que después de storeFile, el nombre del archivo guardado en el servidor FTP es ISO-8859-1 codificada en lugar de UTF-8.

¿Cómo puedo decir que FTPClient a UTF-8 codifiquen los nombres de los archivos?

+1

Diría que está buscando en el lugar equivocado, esta es probablemente una configuración en el servidor FTP ... – Marcelo

+1

No necesariamente. La especificación del protocolo FTP original no era compatible con Unicode en absoluto. Para utilizar UTF-8 a través de una conexión FTP, ambas partes tienen que aceptar primero su uso. El servidor debe informar en el comando 'FEAT' que incluso admite UTF-8 (consulte RFC 2640, aunque no todos los servidores admiten esa especificación). Algunos servidores requieren que los clientes envíen comandos no estándar 'OPTS UTF8 ON' u 'OPTS UTF-8 NLST' para activar UTF-8. Entonces esa es la pregunta de $ 1M: ¿qué soporte 'FTPClient', y qué soporte tiene el servidor? Usaría un detector de paquetes, como WareShark, para ver el tráfico FTP y ver. –

Respuesta

24

Yo no lo he probado, pero se puede tratar this:

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

Sí, setControlEncoding es correcto. Sin embargo, es importante llamar a setControlEncoding antes de conectar, de lo contrario, no funciona. De hecho, creo que este es un diseño desafortunado de la biblioteca, ver también http://yaseb.wordpress.com/2012/03/07/apache-commons-unfortunate-design-of-ftpclient/ – gefei

6

Dado que Apache Commons NET 3.0 se puede utilizar ftpClient.setAutodetectUTF8(true); para permitir la detección automática de soporte UTF-8 en el servidor FTP. Como setControlEncoding, debe llamarse antes de la conexión.

Consulte la correspondiente javadoc.

Cuestiones relacionadas