FtpClient storeFile всегда возвращает False - PullRequest
16 голосов
/ 16 ноября 2011

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

        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;

Buttttttttt

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

Для вашей информации, 1) Я нахожусь в офисной сети. ---> нам нужно добавить прокси?


          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...

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

Ответы [ 5 ]

22 голосов
/ 16 ноября 2011

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

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

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

5 голосов
/ 25 января 2012

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

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

2 голосов
/ 04 февраля 2014

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

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

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

1 голос
/ 02 марта 2015

пожалуйста, добавьте библиотеку 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;
    }
0 голосов
/ 16 сентября 2015

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

...