2017-05-10 44 views
1

Apache MINAを使用してFTPSサーバをセットアップしました。デフォルトのftpletをオーバーライドすると、クライアントが新しいファイルをサーバーにアップロードするときに検出できます。ファイルをディスクに書き込む代わりに、転送をS3データベースにリダイレクトしたいと思います。私たちは要求Apache MINA FTPサーバーにアップロードされたファイルをデータベースにリダイレクトする方法は?

からのデータ入力ストリームを取得することができます。しかし、私は二つの引数からそのストリームを取得する方法を見つけることができません

ことMINAプロジェクトの状態(https://mina.apache.org/ftpserver-project/ftplet.html)でftpletドキュメント。

また、FAQにダウンロードがonDownloadStart法(https://mina.apache.org/ftpserver-project/faq.html#how-can-i-send-binary-data-stored-in-a-database-when-the-ftp-server-gets-the-retr-command)をオーバーライドすることで、データベースから取得されたコードの例がある:

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

しかし、私は、最新MINAバージョン(ミナを使用していますが-core 2.0.16、ftplet-api 1.1.1、ftpserver-core 1.1.1)、そのメソッドには3番目の引数は含まれていません。これは最新のバージョンで変更されましたか?

答えて

1

onDownloadStart例は古くなっているようです。まず、FtpletEnumクラスは、ftplet-apiの初期バージョンの一部でした。新しいバージョンはもはやそれを持っていません。少なくとも私はそれを見つけることができませんでした。

それでも、アップロードされたファイルをクライアントから取得することは可能です。 DefaultFtpletonUploadStartメソッドをオーバーライドするときに、セッションからDataConnectionを要求することができます。

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のような異なる応答コードを送信する必要があります。

関連する問題