Как перенаправить загруженный файл на FTP-сервер Apache MINA в базу данных?

Я настроил сервер FTPS, используя Apache MINA. Переопределяя ftplet по умолчанию, я могу определить, когда клиент начинает загружать новый файл на сервер. Я хочу перенаправить передачу в базу данных S3 вместо записи файла на диск. В документации по ftplet в проекте MINA указано (https://mina.apache.org/ftpserver-project/ftplet.html), что

Мы можем получить поток ввода данных из запроса

Но я не могу найти, как получить этот поток из двух аргументов.

Кроме того, в FAQ есть пример кода, в котором загрузка осуществляется из базы данных путем переопределения метода onDownloadStart (https://mina.apache.org/ftpserver-project/faq.html#how-могулияотправитьдвоичныеданные,хранящиесявбазеданных,когдаftp-серверполучаеткомандуretr):

public FtpletEnum onDownloadStart(FtpSession session, FtpRequest request,
    FtpReplyOutput response) throws FtpException, IOException {
....

Однако я использую последнюю версию MINA (mina-core 2.0.16, ftplet-api 1.1.1, ftpserver-core 1.1.1), и этот метод не включает третий аргумент. Изменилось ли это в последних версиях??


person Alberto Anguita    schedule 10.05.2017    source источник


Ответы (1)


Пример onDownloadStart, на который вы ссылаетесь, кажется устаревшим. Во-первых, используемый класс FtpletEnum был частью ранней версии ftplet-api. В новых версиях его уже нет. По крайней мере мне не удалось найти.

Несмотря на это, все еще возможно получить загруженный файл от клиента. Вы можете запросить DataConnection из сеанса при переопределении метода DefaultFtplet onUploadStart.

OutputStream outputStream = new ByteArrayOutputStream();
DataConnectionFactory connectionFactory = session.getDataConnection();
try {
    DataConnection dataConnection = connectionFactory.openConnection();
    dataConnection.transferFromClient(session, outputStream);
    // now outputstream contains the uploaded file and you could
    // store it in S3 if you wish
} catch (Exception e) {
    e.printStackTrace();
} finally {
    connectionFactory.closeDataConnection();
}

Имейте в виду, что вам также может потребоваться уведомить клиента с помощью кодов ответов, если ваш метод onUploadStart возвращает SKIP. Из Ftplet docs

Этот метод будет вызываться перед загрузкой файла. Имя файла можно получить из аргумента запроса. Мы можем получить поток ввода данных из запроса. Это будет вызвано перед проверкой разрешения. Это вызывается во время команды STOR. Если метод возвращает SKIP, он должен отправлять ответы до и после обработки. Например, перед открытием потока ввода данных метод должен уведомить клиента с кодом ответа 150. Аналогично, после передачи данных метод должен уведомить клиента с кодом ответа 226. В случае какой-либо ошибки метод должен отправлять разные коды ответов, такие как 450, 425, 426, 551.

person Indrek Ots    schedule 22.10.2017