AngularJS:如何通过websocket发送文件?

时间:2017-07-06 03:58:28

标签: javascript angularjs websocket blob

我是websocket的新手,我已经分配了一个现有的工作聊天模块,目前只是向其他用户发送消息。我被要求整合功能,用户可以发送"附件"对彼此。仅供参考,I came across this link,但我需要更多清晰度。

我的问题:

  1. 其实施的服务器端要求是什么?
  2. 有人可以提供一些精心解答的答案吗?我们非常感谢更多的代码而非文字。
  3. 我是否需要使用use ng-file-upload for the sameDEMO
  4. 此问题的任何相关链接
  5.   

    更新1:

    我尝试在下面的代码中实现:

    var input = document.querySelector('input[type=file]');
    
    function readFile(event) {
        var ws_msg =  {content: event.target.result };
        // Here I call the ws.send method 
        send_chat_message($scope.sender, $scope.receiver , ws_msg );
    }
    
    function changeFile() {
        var file = input.files[0];
        var reader = new FileReader();
        reader.addEventListener('load', readFile);
        reader.readAsText(file);
    }
    
    input.addEventListener('change', changeFile);
    

    选择文件会自动尝试通过ws发送,但由于某种奇怪的原因, WS连接立即关闭

1 个答案:

答案 0 :(得分:1)

我试过下面的示例代码。我已经将https://github.com/websockets/ws用于web-socket服务器。在HTML / jS我修改过的代码如下工作正常。步骤如下。 (希望你安装了节点)。

  1. 创建一个文件夹并执行npm install --save ws
  2. 创建一个server.js文件并添加以下代码。

            const WebSocket = require('ws');
    
            const wss = new WebSocket.Server({ port: 8080 });
    
            wss.on('connection', function connection(ws) {
              ws.on('message', function incoming(message) {
                console.log('received: %s', message);
              });
    
              ws.send('something');
            });
    
  3. 使用节点server.js运行节点服务器,你的websocket服务器在localhost上运行:8080

  4. 在您的浏览器中,js更改代码如下(您正在使用angular,请根据您的要求稍后进行更改)

                var input = document.querySelector('input[type=file]');
            var socket = new WebSocket('ws://localhost:8080');
    
                socket.addEventListener('open', function (event) {
                    socket.send('Hello Server!');
                });
    
    
            function readFile(event) {
                var ws_msg =  {content: event.target.result };
                socket.send(ws_msg);
                // Here I call the ws.send method 
                //send_chat_message($scope.sender, $scope.receiver , ws_msg );
            }
    
            function changeFile() {
                var file = input.files[0];
                var reader = new FileReader();
                reader.addEventListener('load', readFile);
                reader.readAsText(file);
            }
    
            input.addEventListener('change', changeFile);
    
  5. 加载您的JS / HTML并将您应该看到的文件上传到节点服务器控制台中的控制台日志。

  6.   

    更新:

    您可以更新节点js服务器代码:

                const WebSocket = require('ws');
                const fs = require('fs');
    
                const wss = new WebSocket.Server({ port: 8080 });
    
    
                wss.on('connection', function connection(ws) {
                  ws.on('message', function incoming(message) {
                    let data =  new Buffer(message);
                        fs.writeFile('new.png', data, 'binary', function (err) {
                            if (err) {
                                console.log("error")
                            }
                            else {
                                console.log("done")
                            }
                        });
                  });
    

    参考: Create image from ArrayBuffer in Nodejs

                  ws.send('something');
                });
    

    客户端(浏览器端js)代码为:

                var input = document.querySelector('input[type=file]');
                var socket = new WebSocket('ws://localhost:8080');
    
                    socket.addEventListener('open', function (event) {
                        socket.send('Hello Server!');
                    });
    
                function readFile(e) {
                    //var ws_msg =  {content: event.target.result };
                     var rawData = e.target.result;
                     socket.send(rawData);
                    // Here I call the ws.send method 
                    //send_chat_message($scope.sender, $scope.receiver , ws_msg );
                }
    
                function changeFile() {
                    var file = input.files[0];
                    var reader = new FileReader();  
                    reader.addEventListener('load', readFile);
                    reader.readAsArrayBuffer(file);
                }
    
                input.addEventListener('change', changeFile);