2012-03-02 10 views
12

Tôi phải tải tệp lên máy chủ FTP. Tên tệp chứa các chữ cái đặc biệt, nói äöü. Trên máy chủ FTP, tôi cần tên tệp được mã hóa UTF-8.Mã hóa tên tệp trong Apache Commons Net FTPClient

Mã của tôi là như thế này:

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

FTPClient client = new FTPClient(); 

... 

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

Vấn đề là sau khi storeFile, tên của các tập tin được lưu trên máy chủ FTP là ISO-8859-1 mã hóa chứ không phải là UTF-8.

Làm cách nào tôi có thể yêu cầu FTPClient để UTF-8 mã hóa tên tệp?

+1

Tôi muốn nói rằng bạn đang tìm kiếm địa điểm sai, đây có thể là cấu hình trong máy chủ FTP ... – Marcelo

+1

Không nhất thiết. Thông số giao thức FTP ban đầu không hỗ trợ Unicode. Để sử dụng UTF-8 qua kết nối FTP, cả hai bên phải đồng ý với việc sử dụng nó trước tiên. Máy chủ phải báo cáo trong lệnh 'FEAT' rằng nó thậm chí còn hỗ trợ UTF-8 (xem RFC 2640, mặc dù không phải tất cả các máy chủ đều hỗ trợ đặc tả đó). Một số máy chủ yêu cầu khách hàng gửi các lệnh 'OPTS UTF8 ON' hoặc' OPTS UTF-8 NLST' không chuẩn để kích hoạt UTF-8. Vì vậy, đó là câu hỏi $ 1 triệu - hỗ trợ 'FTPClient' và máy chủ hỗ trợ những gì? Tôi sẽ sử dụng một gói sniffer, như WareShark, để xem lưu lượng truy cập FTP và xem. –

Trả lời

24

tôi đã không kiểm tra nó, nhưng bạn có thể thử this:

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

Có, setControlEncoding là đúng. Điều quan trọng là, tuy nhiên, để gọi setControlEncoding trước khi kết nối, nếu không nó không hoạt động. Tôi thực sự nghĩ rằng đây là một phần thiết kế không may của thư viện, xem thêm http://yaseb.wordpress.com/2012/03/07/apache-commons-unfortunate-design-of-ftpclient/ – gefei

6

Kể từ Apache Commons NET 3.0 ai có thể sử dụng ftpClient.setAutodetectUTF8(true); để cho phép dò của UTF-8 hỗ trợ trên máy chủ FTP. Giống như setControlEncoding, nó phải được gọi trước khi kết nối.

Xem javadoc tương ứng.