如何将Apache MINA FTP服务器中上传的文件重定向到数据库?

时间:2017-05-10 10:43:27

标签: ftp mina

我使用Apache MINA设置了FTPS服务器。通过覆盖默认的ftplet,我可以检测到客户端何时开始将新文件上传到服务器。我想将传输重定向到S3数据库,而不是将文件写入磁盘。 MINA项目中的ftplet文档说明了(https://mina.apache.org/ftpserver-project/ftplet.html

  

我们可以从请求中获取数据输入流

但我找不到如何从两个参数中获取该流。

此外,在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版本(mina-core 2.0.16,ftplet-api 1.1.1,ftpserver-core 1.1.1),该方法不包含第三个参数。这是在最新版本中改变了吗?

1 个答案:

答案 0 :(得分:1)

您所指的onDownloadStart示例似乎已过时。对于初学者,使用的FtpletEnum类是ftplet-api的早期版本的一部分。较新的版本不再拥有它。至少我找不到它。

尽管如此,它仍然可以从客户端获取上传的文件。在覆盖DataConnection的{​​{1}}方法时,您可以从会话中要求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(); } 方法返回SKIP,则可能还必须通过响应代码通知客户端。来自Ftplet docs

  

在文件上传之前将调用此方法。文件名可以从请求参数中获取。我们可以从请求中获取数据输入流。这将在权限检查之前调用。在STOR命令期间调用此方法。如果该方法返回SKIP,则必须在处理之前和之后发送响应。例如,在打开数据输入流之前,该方法必须用响应代码150通知客户端。类似地,在数据传输之后,该方法必须用响应代码226通知客户端。如果有任何错误,方法应该发送不同的响应代码,如450,425,426,551。