2012-03-02 13 views
12

Devo caricare un file su un server FTP. Il nome file contiene lettere speciali, ad esempio äöü. Sul server FTP, ho bisogno che il nome del file sia codificato in UTF-8.Codifica del nome file in Apache Commons Net FTPClient

Il mio codice è simile a questo:

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

FTPClient client = new FTPClient(); 

... 

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

Il problema è che dopo storeFile, il nome del file salvato sul server FTP è ISO-8859-1 codifica piuttosto che UTF-8.

Come posso dire a FTPClient in UTF-8 codificare i nomi dei file?

+1

Direi che stai cercando nel posto sbagliato, questa è probabilmente una configurazione nel server FTP ... – Marcelo

+1

Non necessariamente. Le specifiche del protocollo FTP originale non supportavano affatto Unicode. Per utilizzare UTF-8 su una connessione FTP, entrambe le parti devono prima accettarne l'uso. Il server deve riportare nel comando "FEAT" che supporta anche UTF-8 (vedere RFC 2640, sebbene non tutti i server supportino tale specifica). Alcuni server richiedono ai client di inviare comandi "OPTS UTF8 ON" o "OPTS UTF-8 NLST" non standard per attivare UTF-8. Quindi questa è la domanda $ 1M - che cosa supporta il 'FTPClient', e cosa supporta il server? Userei uno sniffer di pacchetti, come WareShark, per guardare il traffico FTP e vedere. –

risposta

24

non l'ho provato, ma si può provare this:

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

Sì, setControlEncoding è giusto. È importante, tuttavia, chiamare setControlEncoding prima della connessione, altrimenti non funziona. In realtà penso che questo sia un pezzo di design sfortunato della biblioteca, vedi anche http://yaseb.wordpress.com/2012/03/07/apache-commons-unfortunate-design-of-ftpclient/ – gefei

6

Dal Apache Commons NET 3.0 si può utilizzare ftpClient.setAutodetectUTF8(true); per consentire il rilevamento automatico di supporto UTF-8 sul server FTP. Come setControlEncoding deve essere chiamato prima della connessione.

Vedere il corrispondente javadoc.