【发布时间】:2021-06-10 22:05:45
【问题描述】:
为了通过 websocket 发送文件,我很难找到文档或教程。 这是我的 JS:
['dragleave', 'drop'].forEach(event_name =>
document.addEventListener(event_name, function(e) {
e.preventDefault();
let files = e.dataTransfer.files;
var reader = new FileReader();
for(let i=0;i<files.length; i++) {
reader.onload = function(event) {
socket.send(event.target.result);
};
reader.readAsArrayBuffer(files[i]);
}
}, false));
我的 rust 代码是基于官方的例子(https://github.com/actix/examples/tree/master/websockets/websocket):
impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for RatioUpWS {
fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx: &mut Self::Context,) {
// process websocket messages
println!("WS: {:?}", msg);
match msg {
Ok(ws::Message::Ping(msg)) => {
self.hb = Instant::now();
ctx.pong(&msg);
}
Ok(ws::Message::Pong(_)) => {self.hb = Instant::now();}
Ok(ws::Message::Text(text)) => {
ctx.text(text);
}
Ok(ws::Message::Binary(bin)) => {
let mut pos = 0;
let mut buffer = File::create("foo.txt").unwrap(); // notice the name of the file that will be written
while pos < bin.len() {
let bytes_written = buffer.write(&bin[pos..]).unwrap();
pos += bytes_written
};
ctx.binary(bin)
},
Ok(ws::Message::Close(reason)) => {
ctx.close(reason);
ctx.stop();
}
_ => ctx.stop(), //if file>64K, it goes here
}
}
}
它似乎被识别为短信,我不知道如何反序列化它。
actix_web::web::Form<FormDataStruct> 好像不太合适。
有什么想法吗?
【问题讨论】:
标签: websocket rust file-transfer rust-actix