2017-05-10 6 views
1

Apache MINA를 사용하여 FTPS 서버를 설정했습니다. 기본 ftplet를 재정 의하여 클라이언트가 새 파일을 서버로 업로드하기 시작할 때이를 감지 할 수 있습니다. 디스크에 파일을 쓰는 대신 S3 데이터베이스로 전송을 리디렉션하고 싶습니다. ftplet의 미나 프로젝트 지역에서의 문서 (https://mina.apache.org/ftpserver-project/ftplet.html)Apache MINA FTP 서버에 업로드 된 파일을 데이터베이스로 리디렉션하는 방법은 무엇입니까?

우리는 요청

의 데이터를 입력 스트림을 얻을 수 있습니다하지만이 두 개의 인수에서 해당 스트림을 얻는 방법을 찾을 수 있습니다.

또한 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) 오버라이드하여, 데이터베이스로부터 획득되는 코드 예이되어, I 최신 미나 버전을 사용하지만

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

가 (미나 -core 2.0.16, ftplet-api 1.1.1, ftpserver-core 1.1.1) 그 메소드는 세 번째 인수를 포함하지 않습니다. 최신 버전에서 변경 되었습니까 ??

답변

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과 같은 다른 응답 코드를 보내야합니다.