我希望通过WebSockets实现大文件的上传,并让服务器将文件存储在数据库或对象存储中。
我正在尝试spring-websocket库,据我所知,我需要扩展BinaryWebSocketHandler类并在那里实现文件存储。
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,并且允许spring-websocket处理InputStream(参见https://docs.oracle.com/javaee/7/api/javax/websocket/MessageHandler.Whole.html)。
不幸的是,我无法在我的处理程序中找到访问InputStream的任何方法。有人知道这是否真的有可能吗?如果没有,这作为一个特性请求是否有意义,或者这是否是对WebSockets的误用?
发布于 2019-10-15 13:19:21
您可以重写AbstractWebSocketHandler.supportsPartialMessages,它声明:
如果将此标志设置为true,并且底层的WebSocketHandler.handleMessage(WebSocketSession,服务器支持部分消息,则可以拆分大型WebSocket消息或未知大小的消息,并可能通过对WebSocketMessage的多次调用来接收该消息)。标志WebSocketMessage.isLast()指示消息是否是部分的,以及它是否是最后一部分。
https://stackoverflow.com/questions/58395489
复制相似问题