发送文件到Actix websocket

发送文件到Actix websocket,websocket,rust,file-transfer,rust-actix,Websocket,Rust,File Transfer,Rust Actix,为了通过websocket发送文件,我很难找到文档或教程。 这是我的JS: ['dragleave','drop'].forEach(事件名称=> 文件。添加事件列表器(事件名称、功能(e){ e、 预防默认值(); 让files=e.dataTransfer.files; var reader=new FileReader(); for(设i=0;i{ self.hb=Instant::now(); ctx.pong(&msg); } Ok(ws::Message::Pong())=>{sel

为了通过websocket发送文件,我很难找到文档或教程。 这是我的JS:

['dragleave','drop'].forEach(事件名称=>
文件。添加事件列表器(事件名称、功能(e){
e、 预防默认值();
让files=e.dataTransfer.files;
var reader=new FileReader();
for(设i=0;i{
self.hb=Instant::now();
ctx.pong(&msg);
}
Ok(ws::Message::Pong())=>{self.hb=Instant::now();}
确定(ws::Message::Text(Text))=>{
ctx.text(text);
}
Ok(ws::Message::Binary(bin))=>{
设mut pos=0;
让mut buffer=File::create(“foo.txt”).unwrap();//注意将要写入的文件名
而pos{
ctx.关闭(原因);
ctx.stop();
}
_=>ctx.stop(),//如果文件>64K,则它将转到此处
}
}
}
它似乎被识别为一条短信,我不知道如何反序列化它。
actix\u web::web::Form
似乎不合适


有什么想法吗?

您的WebSocket服务器正在将消息识别为文本,因为您的JavaScript代码正在使用
FormData()
而不是使用

要使用WebSocket从浏览器传输文件,可以使用以下示例代码(请注意WebSocket声明和
sendFile()
函数):

要在服务器端处理传输的字节,可以使用标准的Rust库。将提供的示例Rust代码更改为使用
std::io
处理.txt文件:

impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for MyWebSocket {
    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(),
        }
    }
}
MyWebSocket的impl StreamHandler{ fn手柄( &莫特·赛尔夫, msg:结果,, ctx:&mut Self::Context, ) { //处理websocket消息 println!(“WS:{:?}”,msg); 配味精{ 确定(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))=>{ 设mut pos=0; 让mut buffer=File::create(“foo.txt”).unwrap();//注意将要写入的文件名 而pos{ ctx.关闭(原因); ctx.stop(); } _=>ctx.stop(), } } } 您可以在本回购协议中查看完整的工作示例:(改编自)


我希望这个答案对您有所帮助。

我现在能够以二进制格式传输和编写小文件(
impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for MyWebSocket {
    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(),
        }
    }
}