Вы не должны иметь места в самой вашей URL в RFC1738 разделе 2.2 запустить его с помощью метода URL Encode кодировать его:
String s = "ftp://username:[email protected]:21/AAB BBC/hhhh 0001.jpg";
String encodedUrl = URLEncoder.encode(s,"UTF-8");
Я понимаю, что вы сказали, что вы уже делали кодировку, но это привело к ошибке 550. Я не видел кодировку, поэтому просто упоминаю, что это необходимо.
Я бы попробовал это в браузере и посмотрел, сможете ли вы с ним добраться. Я также выкинул бы URL-адрес, который он использует, и попробуйте сделать это из браузера (или wget, curl, независимо от того, что вам удобно). «550» указан как проблема «разрешения», а не файл не найден, поэтому я немного удивлен этим, но это может быть короткий код и выходить как ошибка, чтобы люди не выкалывали вокруг тестирования пользователя/пароля комбинации. Сложно сказать.
Другой вопрос, который у меня для вас, заключается в том, что вы упоминаете, что не хотите решения клиента, но вы, кажется, пишете клиент, а не сервер. Вы собираетесь на порт 21, который является FTP-портом по умолчанию для сервера.
Я бы попробовал различные комбинации кодировки и посмотрел, может быть, вы не кодируете все ... вы должны закодировать URL-адрес. Есть ли в пароле какие-то напуганные символы?
Тестирование в браузере напрямую даст вам много информации.