Apache Commons Net FTPClient - ставить вместо STOR?

Я использую Apache Commons Net FTPClient для распространения файлов как часть пакетных заданий. Клиент инкапсулирован, но примерно я выполняю следующие вызовы методов (для краткости я пропустил обработку ошибок, обработку потоков и т. Д.):

FTPClient client = new FTPClient();
client.connect("127.0.0.1", 22);
client.login("user", "password");
client.setFileType(FTP.BINARY_FILE_TYPE);
client.changeWorkingDirectory("path/");
client.storeFile("file1.txt", new ByteArrayInputStream("hello world".getBytes()));
client.disconnect();

Когда я выполняю команды выше, на FTP-сервер отправляются следующие команды:

USER zoor
PASS ********
TYPE I
CWD path/
PORT 127,0,0,1,229,72
STOR file1.txt

И это прекрасно работает. Однако сейчас я нахожусь в ситуации, когда мне нужно отправить файлы в устаревшую систему, которая не поддерживает CWD или же STOR но вместо этого опирается на CD а также PUTсоответственно..

Теперь мой вопрос: как мне заставить FTPClient использовать эти команды?

Я мог бы использовать sendCommand способ отправить CD команда, но я не уверен, как сделать это правильно (и правильно) с помощью команды PUT (учитывая, что я должен также отправить данные файла).

ПРИМЕЧАНИЕ: я понимаю, что есть лучшие способы, чем FTP, для распространения таких файлов, но, к сожалению, мои руки связаны. Получатели используют FTP и не хотят менять.

ОБНОВЛЕНИЕ: Устаревшая система представляет собой компьютер AS/400.

2 ответа

Решение

Мне пришло в голову, что CD и PUT на самом деле не являются командами FTP, и поэтому вопрос не имеет особого смысла. Решение (потому что оно нужно нам как можно скорее) состоит в том, что мы передаем файлы на наш собственный FTP-сервер и вызываем скрипт через SSH на том сервере, который передает файлы на компьютер AS/400.

Это должно сработать, я понимаю, что вы работали над этой проблемой, но для полноты картины вы знаете, нужны ли AS/400 какие-либо команды сайта для сохранения файла.

В чем ошибка твоего возвращения?

Я регулярно отправляю файлы в MVS / Z/OS, и есть несколько команд сайта, которые необходимо отправить в первую очередь для хранения и настройки.

Команды сайта будут выглядеть примерно так:

  • TRAIL
  • ЦИЛИНДРЫ ПЕРВИЧНЫЕ =350 ВТОРИЧНЫЕ = 300
  • RECFM = FB LRECL = 1516 BLKSIZE = 31836
  • CONDDISP = удалить

Вот небольшой код, который я использую, ftp - это, по сути, FTPClient, который вы используете в своем примере.

    public boolean sendSiteCommand(String siteCmd){
    if (null == siteCmd){
        System.err.println("Warning, Null Parameter sent to sendSiteCommand, aborting...");
        return false;
    }

    try{

        return ftp.sendSiteCommand(siteCmd);

    }catch (Exception e){
        System.out.println("Error Occurred Sending Site Command to Remote System, aborting...");
        e.printStackTrace(System.err);
        return false;
    }
}

Если вам действительно нужно загрузить файл как другую команду, вы всегда можете расширить FTPClient и вызвать внутренние методы с другой командой. Они построены так, что вы можете дать любую строку в качестве команды для уже существующих хранилищ.

Пример:

    public static class OldFtpClient extends FTPClient {
        public OutputStream putFileStream(String remote) throws IOException {
            return _storeFileStream("PUT", remote);
        }
    }

Источник класса можно найти по адресу https://github.com/apache/commons-net/blob/master/src/main/java/org/apache/commons/net/ftp/FTPClient.java.

Другие вопросы по тегам