如何将二进制消息作为输入流进行处理?

How to process binary messages as input streams?

我想通过 WebSockets 实现大文件上传,并让服务器将文件存储在数据库或对象存储中。

我正在试用 spring-websocket 库,据我所知,我需要扩展 BinaryWebSocketHandler class 并在那里实现文件存储。

public class MyWebSocketHandler extends BinaryWebSocketHandler {

    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
          // Store file in DB/OS...
    }

}

虽然这看起来很棒,但我的问题是我要处理的 BinaryMessage 只允许我使用 ByteBuffer。我假设这意味着整个文件都加载到内存中并存储在这个 ByteBuffer 对象中(当然,除非我也覆盖了 supportsPartialMessages 方法)。这是正确的吗?

如果是,这对我来说将是一个大问题,因为在内存中存储大文件不是我想做的事情。我期望能够访问 InputStream 并从那里读取文件。这似乎也应该是可能的,因为 spring-websocket 在幕后使用 Java WebSocket API,并且它们允许 MessageHandlers 处理 InputStreams (参见 https://docs.oracle.com/javaee/7/api/javax/websocket/MessageHandler.Whole.html)。

不幸的是,我找不到任何方法来访问我的处理程序中的 InputStream。有谁知道这是否真的可能?如果不是,这作为功能请求是否有意义,或者这是否会以某种方式滥用 WebSockets?

您可以覆盖 AbstractWebSocketHandler.supportsPartialMessages,其中规定:

If this flag is set to true and the underlying WebSocket server supports partial messages, then a large WebSocket message, or one of an unknown size may be split and maybe received over multiple calls to WebSocketHandler.handleMessage(WebSocketSession, WebSocketMessage). The flag WebSocketMessage.isLast() indicates if the message is partial and whether it is the last part.

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/socket/WebSocketHandler.html