Я хочу осуществить загрузку больших файлов через 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
s. Я предполагаю, что это означает, что весь файл загружается в память и сохраняется в этом объекте ByteBuffer
(если, конечно, я также не переопределил метод supportsPartialMessages
). Это правильно?
Если да, это будет для меня огромной проблемой, поскольку я не хочу делать большие файлы в памяти. Я ожидал, что смогу получить доступ к InputStream
и прочитать файл оттуда. Также кажется, что это должно быть возможно, поскольку spring-websocket
использует Java WebSocket API под капотом, и они позволяют MessageHandler
s обрабатывать InputStream
s (см. https://docs.oracle.com/javaee/7/api/javax/websocket/MessageHandler.Whole.html).
К сожалению, яне могу найти способ получить доступ к InputStream
в моем обработчике. Кто-нибудь знает, возможно ли это на самом деле? Если нет, то будет ли это иметь смысл как запрос функции или это будет каким-то образом неправильным использованием WebSockets?