Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

добавьте библиотеку 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;
    }

Ответ 5

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