Как обрабатывать двоичные сообщения как входные потоки? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу осуществить загрузку больших файлов через 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?

1 Ответ

0 голосов
/ 15 октября 2019

Вы можете переопределить AbstractWebSocketHandler.supportsPartialMessages, который гласит:

Если для этого флага установлено значение true и базовый сервер WebSocket поддерживает частичные сообщения, то большое сообщение WebSocket или одно из неизвестныхразмер может быть разделен и может быть получен через несколько вызовов WebSocketHandler.handleMessage (WebSocketSession, WebSocketMessage). Флаг WebSocketMessage.isLast () указывает, является ли сообщение частичным и является ли оно последней частью.

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

...