Ошибка загрузки файла FTPClient method метод retrieveFile () replyCode = 550 - PullRequest
5 голосов
/ 26 сентября 2011

/ * Я запускаю FTP-сервер на localhost. Когда я загружаю файлы, использую метод ftpClient.retrieveFile (), его responseCode равен 550.Я читаю API commons-net и нахожу 550 responseCode, который определяет "public static final int FILE_UNAVAILABLE 550". Но я не могу найти проблему по своим кодам.
спасибо за вашу помощь.

* /

    FTPClient ftpClient = new FTPClient();
    FileOutputStream fos = null;

    try {
        ftpClient.connect("192.168.1.102",2121);
        ftpClient.login("myusername", "12345678");
        ftpClient.setControlEncoding("UTF-8");
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        String remoteFileName = "ftpserver.zip";//this file in the rootdir
        fos = new FileOutputStream("f:/down.zip");
        ftpClient.setBufferSize(1024);
        ftpClient.enterLocalPassiveMode();
        ftpClient.enterLocalActiveMode();
        ftpClient.retrieveFile(remoteFileName, fos);  
        System.out.println("retrieveFile?"+ftpClient.getReplyCode());
        fos.close();
        ftpClient.logout();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            ftpClient.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("关闭FTP异常", e);
        }
    }

Ответы [ 6 ]

9 голосов
/ 15 мая 2013

Я обнаружил, что Apache retrieveFile (...) иногда не работает с размерами файлов, превышающими определенный предел.Чтобы преодолеть это, я бы использовал retrieveFileStream () вместо этого.Перед загрузкой я установил Correct FileType и установил режим на PassiveMode

, поэтому код будет выглядеть как

    ....
    ftpClientConnection.setFileType(FTP.BINARY_FILE_TYPE);
    ftpClientConnection.enterLocalPassiveMode();
    ftpClientConnection.setAutodetectUTF8(true);

    //Create an InputStream to the File Data and use FileOutputStream to write it
    InputStream inputStream = ftpClientConnection.retrieveFileStream(ftpFile.getName());
    FileOutputStream fileOutputStream = new FileOutputStream(directoryName + "/" + ftpFile.getName());
    //Using org.apache.commons.io.IOUtils
    IOUtils.copy(inputStream, fileOutputStream);
    fileOutputStream.flush();
    IOUtils.closeQuietly(fileOutputStream);
    IOUtils.closeQuietly(inputStream);
    boolean commandOK = ftpClientConnection.completePendingCommand();
    ....
2 голосов
/ 26 сентября 2011

Ошибка FTP 550 Запрошенное действие не выполнено.Файл недоступен, не найден, недоступен

Так что я думаю, что это немного странно, я не устанавливаю кодировку управления и не использую retrieveFile, просто отправляя обычную строку в Java.Также эта строка:

ftpClient.retrieveFile(new String(remoteFileName.getBytes("ms932"),"ISO-8859-1"), fos);

ничего не делает, потому что вы создаете новую строку Java из другой строки.Строки Java хранятся в памяти в другой кодировке, совместимой со всеми кодировками, если я не ошибаюсь.

Кроме того, вы используете неверный путь, см .:

String remoteFileName = "//ftpserver.zip";

Ftp будетвызвать ошибку, начиная путь с /, попробуйте это:

"ftpserver.zip"

или, если у вас есть subdir, попробуйте это:

"subdir/myfile.zip"

Cheers

1 голос
/ 16 апреля 2012

Недавно я столкнулся с той же ошибкой, но в основном потому, что путь был неправильным, и вместо добавления косой черты, как в /data/csms/trt/file.txt, он добавлялся как /data/csms/trtfile.txt ... поэтому файл не был извлечен из нужного места.

0 голосов
/ 24 января 2016

У меня была такая же проблема, потому что в моей памяти SDCARD / PHONE не было места.

0 голосов
/ 05 ноября 2013

Похоже, выходной путь не правильный. Проверьте общий корневой каталог на вашем сервере. Если корнем является f: \, а ваш файл находится в этом корневом каталоге, то вам нужно только сделать это: `fos = new FileOutputStream (" down.zip ");

Если ваш файл находится в подкаталоге корня, например, f: \ sub, то он должен быть fos = new FileOutputStream("sub\\down.zip");

0 голосов
/ 08 февраля 2013

setControlEncoding необходимо вызывать перед подключением, как это

[...]
try {
    ftpClient.setControlEncoding("UTF-8");
    ftpClient.connect("192.168.1.102",2121);
    ftpClient.login("myusername", "12345678");
[...]
...