私がやりたいことは、onUploadStart
メソッドをオーバーライドしてカスタム アップロード ローカリゼーション (一時フォルダー)を作成し、onUploadEnd
メソッドをオーバーライドして、正常にアップロードされたファイルを元の宛先フォルダーにコピーすることです。Apache Mina FTP サーバーのホームページには、「この通知メソッドは、ファイル転送が成功し、サーバーが応答を送信したことを示すために呼び出されます。エラーが発生した場合、このメソッドは呼び出されません。これは STOR コマンドで呼び出されます。」しかし・・・割り込みで転送が終了してもonUploadEndメソッドが呼び出される。このコードを見てください:
public class TestFtplet extends DefaultFtplet{
@Override
public FtpletResult onUploadStart(FtpSession session, FtpRequest request) {
System.out.println("Receiving upload request. Starting...." + request.getCommand());
return FtpletResult.DEFAULT;
}
@Override
public FtpletResult onUploadEnd(FtpSession session, FtpRequest request) {
System.out.println("Ending uploading.... "+ request.getCommand() + request.getArgument() + request.getRequestLine());
System.out.println(": " + session.getUserArgument() + session.toString());
return FtpletResult.DEFAULT;
}
アップロードが中断されたかどうかにかかわらず、まったく同じ出力が得られます。転送中にABORリクエストをキャッチする方法はありますか?
オーバーライドされたメソッド内に別のコードを書きましたbeforeComand
(以下のコードは STOR の場合に実行されますrequest.getCommand()
):
System.out.println("\n\n****** RECEIVED UPLOAD REQUEST *******\n\n");
DataConnectionFactory dataConnectionFactory = session.getDataConnection();
try {
System.out.println("Receiving file " + request.getArgument());
temporaryFile = File.createTempFile("FTP_", ".tmp");
OutputStream outputStream = new FileOutputStream(temporaryFile);
DataConnection dataConnection = dataConnectionFactory.openConnection();
session.write(new DefaultFtpReply(150, "Transfering data..."));
dataConnection.transferFromClient(session, outputStream);
System.out.println("Writing file to temporary destination " + temporaryFile.getAbsolutePath());
outputStream.flush();
outputStream.close();
Path source = Paths.get(temporaryFile.getAbsolutePath());
Path destination = Paths.get("C:\\apache-ftpserver-1.0.6\\res\\home\\"+request.getArgument());
if(request.getCommand().toUpperCase().equals("ABOR")) {
System.out.println("Upload interrupted!");
destination = Paths.get("C:\\apache-ftpserver-1.0.6\\res\\unfinished\\"+request.getArgument());
Files.move(source, destination, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Moved file to " + destination);
} else {
Files.move(source, destination, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Done! File moved to " + destination);
}
ファイルを一時フォルダーに正常に書き込んでいますが、if(request.getCommand().toUpperCase().equals("ABOR"))
FTP クライアントがアップロードを中断して ABOR を送信した場合でも、常に false を返します。これを処理する方法はありますか?