我想通过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 WebSocket API,并且它们允许MessageHandler
处理InputStream
(请参阅https://docs.oracle.com/javaee/7/api/javax/websocket/MessageHandler.Whole.html),这似乎应该可行。
不幸的是,我找不到在处理程序中访问InputStream
的任何方法。有人知道这是否真的可能吗?如果不是这样,将其作为功能请求有意义吗?还是某种程度上滥用WebSocket?
答案 0 :(得分:0)
您可以覆盖AbstractWebSocketHandler.supportsPartialMessages
,其中指出:
如果将此标志设置为true并且基础WebSocket服务器支持部分消息,则可能会拆分大的WebSocket消息或大小未知的消息,并且可能会通过多次调用WebSocketHandler.handleMessage(WebSocketSession,WebSocketMessage)来接收。标志WebSocketMessage.isLast()指示消息是否为部分消息以及是否为最后一部分。