Я пытаюсь загрузить файл через 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.
Метод BinaryWebSocketFrame.content()
возвращает ByteBuf
. Методы ByteBuf имеют метод readBytes(...)
который принимает OutputStream
который вы можете использовать для записи в файл.
Я нашел это... вот пример кода в дополнение
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();
}