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.