我使用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),该方法不包含第三个参数。这是在最新版本中改变了吗?
答案 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。