FtpClient storeFile всегда возвращает False

Пожалуйста, разберись с этим. Код работает правильно без каких-либо исключений.

try
{
    FTPClient ftp = new FTPClient();
    ftp.connect(server);
    if(!ftp.login(username, password))
    {
        ftp.logout();
        return false;
    }
    int reply = ftp.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply))
    {
        ftp.disconnect();
        return false;
    }
    InputStream in = new FileInputStream(localfile);
    ftp.setFileType(ftp.BINARY_FILE_TYPE, ftp.BINARY_FILE_TYPE);
    ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE);
    Store = ftp.storeFile(destinationfile, in);
    in.close();
    ftp.logout();
    ftp.disconnect();
}
catch (Exception ex)
{
    ex.printStackTrace();
    return false;
}
return Store;

Но оператор return всегда возвращает false, и файл не загружается на сервер. Кто-нибудь, пожалуйста, помогите с этим.

К вашему сведению, я нахожусь в офисной сети. --- ›нужно ли добавлять прокси?


File file = new File("C:\\Users\\sg0214273\\Desktop\\seagate\\seagate.txt");
FileInputStream input = new FileInputStream(file);
client.setFileType(FTP.BINARY_FILE_TYPE);
if (!client.storeFile(file.getName(), input)) {
  System.out.println("upload failed!");
} 
reply = client.getReplyCode();

if(!FTPReply.isPositiveCompletion(reply)) {
  System.out.println("upload failed!");
}
Login success...
230 User ******** logged in.
upload failed!-----> is form boolean return value of storefile 
upload failed!---------> is from replycode...
Logout from FTP server...

Пожалуйста, помогите.


person RaviKiran    schedule 16.11.2011    source источник


Ответы (5)


Точное сообщение об ошибке можно найти, вызвав FtpClient # getReplyCode (). С той страницы (выделено мной):

Сразу после подключения - единственное, что вам нужно в режиме реального времени, чтобы проверить код ответа (поскольку подключение имеет тип void). Соглашение для всех методов команд FTP в FTPClient таково, что они либо возвращают логическое значение, либо какое-либо другое значение. Логические методы возвращают true при успешном завершении ответа от FTP-сервера и false при ответе, приводящем к возникновению ошибки или сбою. Методы, возвращающие значение, отличное от логического, возвращают значение, содержащее данные более высокого уровня, созданные командой FTP, или null, если ответ привел к возникновению ошибки или сбоя. Если вы хотите получить доступ к точному коду ответа FTP, вызвавшему успех или неудачу, вы должны вызвать getReplyCode после успеха или неудачи.

Чтобы узнать, что означает код возврата, вы можете просмотреть Википедию: список кодов возврата FTP-сервера.

person Matthew Farwell    schedule 16.11.2011

Тема довольно старая, но, возможно, я помогу кому-нибудь другому. Я сравнил то, что FileZilla отправляет на FTP-сервер, и моя программа. Мне нужно было использовать ftp.enterLocalPassiveMode(), чтобы он заработал, ftp.pasv() бесполезно :)

А для отладки лучше использовать getReplyString(), чем только getReplyCode().

person jasiustasiu    schedule 25.01.2012

Измените код, чтобы переключиться в пассивный режим, прежде чем передавать файл с storeFile() следующим образом:

...
ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();//Switch to passive mode
Store = ftp.storeFile(destinationfile, in);
in.close();
...

Надеюсь, это поможет.

person Babatunde Adeyemi    schedule 04.02.2014
comment
У меня только что возникла проблема с использованием Apache Commons FTP в качестве клиента, подключающегося с машины разработчика Windows 7 к тестовому ftp-серверу Windows 7 на IIS 7.5. Ftp.storefile вернул ReplyCode 501 (который утверждает, что это синтаксическая ошибка). Исправление заключалось в установке пассивного режима для сервера и клиента с помощью ftp.enterRemotePassiveMode (); ftp.enterLocalPassiveMode (); - person MartinS; 13.02.2015
comment
когда я использую этот client.enterLocalPassiveMode (); тогда строка ответа - 522 Соединения для передачи данных должны быть зашифрованы. - person Farrukh Sarmad; 12.02.2019

пожалуйста, добавьте библиотеку apache для этого кода, это импортированный класс

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

класс импорта остальных из java.io или java.net

public boolean upload(String server,String username,String password,File localfile ){
        boolean Store=false;
        try{
        FTPClient ftp = new FTPClient();
               // ftp.connect(server);
    /* you can use either code which is written above above or below code as ftp port 20 is used for the data transfer and port 21 is used for command and controlls */
           ftp.connect(InetAddress.getByName(server),21); 
    //here 'server' is your domain name of ftp server or url
                if(!ftp.login(username, password))
                {
                    ftp.logout();
                    return false;
                }
          ftp.sendNoOp();//used so server timeout exception will not rise
                int reply = ftp.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply))
                {
                    ftp.disconnect();
                    return false;
                }
              ftp.enterLocalPassiveMode(); /* just include this line here and your code will work fine */
                InputStream in = new FileInputStream(localfile);
              // ftp.setFileType(ftp.BINARY_FILE_TYPE, ftp.BINARY_FILE_TYPE);
               ftp.setFileType(FTP.BINARY_FILE_TYPE);
               // ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE);
                Store = ftp.storeFile(destinationfile, in);
                in.close();
             //ftp.disconnect();
     //here logout will close the connection for you
                ftp.logout();

            }
            catch (Exception ex)
            {
                ex.printStackTrace();
                return false;
            }
        return Store;
    }
person Naval Kishor Jha    schedule 02.03.2015
comment
Спасибо Naval. ftp.enterLocalPassiveMode (); мне действительно помогло. - person yaryan997; 24.06.2015
comment
когда я использую этот client.enterLocalPassiveMode();, тогда строка ответа 522. Соединения для передачи данных должны быть зашифрованы. - person Farrukh Sarmad; 12.02.2019

Попробуйте использовать ftp.enterLocalPassiveMode (); перед ftp.storeFile (файл назначения, in);

person Thiago Pires    schedule 16.09.2015
comment
когда я использую этот client.enterLocalPassiveMode (); тогда строка ответа - 522 Соединения для передачи данных должны быть зашифрованы. - person Farrukh Sarmad; 12.02.2019