首页 文章

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

提问于
浏览
1

我使用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 回答

  • 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 .

相关问题