Загрузить файл через WebSocket (BinaryWebSocketFrame) и Netty

1

Я пытаюсь загрузить файл через websockets с помощью следующего кода:

let file = e.target.files[0]
let ws = new WebSocket("ws://127.0.0.1:8080/")
ws.binaryType = "arraybuffer";

var reader = new FileReader();
var rawData = new ArrayBuffer();

ws.onopen = () => {

    reader.loadend = function() {}

    reader.onload = function(e) {
        rawData = e.target.result;
        ws.send(rawData);
        console.log("Transfer complete.")
    }

    reader.readAsArrayBuffer(file);

}

Websocket хорошо работает с текстами, и соединение определенно не является проблемой. Но, придя к очень подробной документации нетто, я не могу найти ничего, как обрабатывать полученный BinaryWebSocketFrame. Вот код Java:

public class SocketHandler extends SimpleChannelInboundHandler<Object> {

    @Override
    public void messageReceived(ChannelHandlerContext ctx, Object msg) throws Exception {

        if (msg instanceof WebSocketFrame) {

            if (msg instanceof BinaryWebSocketFrame) {

                System.out.println("BinaryWebSocketFrame Received : ");
                BinaryWebSocketFrame frame = (BinaryWebSocketFrame) msg;

                //This is nothing more than an echo.. It is received by the client successfully.
                ctx.writeAndFlush(new BinaryWebSocketFrame(frame.isFinalFragment(), frame.rsv(), frame.content()));

            } else if (msg instanceof TextWebSocketFrame) {

                System.out.println("TextWebSocketFrame Received : " + ((TextWebSocketFrame) msg).text());

            }

        }

    }

}

Моя проблема заключается в BinaryWebSocketFrame.. как я могу сохранить его в файл сейчас? Или что содержится в этом байтобуфе? Могу ли я сохранить путь, в котором файл должен храниться в buf? Я не очень хорошо разбираюсь в ByteBuffers, поэтому, пожалуйста, зайдите подробно. Нет никакой документации по этому поводу в netty.

Теги:
websocket
netty
bytebuffer

2 ответа

2
Лучший ответ

Метод BinaryWebSocketFrame.content() возвращает ByteBuf. Методы ByteBuf имеют метод readBytes(...) который принимает OutputStream который вы можете использовать для записи в файл.

  • 0
    Вы можете добавить пример кода? Например, что это параметры readBytes?
2

Я нашел это... вот пример кода в дополнение

BinaryWebSocketFrame frame = (BinaryWebSocketFrame) msg;
ByteBuf buffer = frame.content().retain();
FileOutputStream outputStream = new FileOutputStream(new File("test.png"));

try {

    if (buffer.isReadable()) {
        buffer.readBytes(outputStream, buffer.readableBytes());
    }

} finally {
    outputStream.close();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню