如何从websocket连接保存来自客户端的传入文本文件

时间:2015-04-20 15:49:43

标签: javascript node.js html5 websocket

我正在尝试在node.js中实现websocket服务器而不使用任何框架。 从客户端发送消息到服务器工作正常。但现在我尝试从客户端向服务器发送文本文件。我可以在终端中使用console.log查看服务器端的内容。 但是:

  1. 如何获取文件信息? (姓名,创建/编辑日期等?)

  2. 如何保存文件?

  3. 客户代码:

    (function () {
        'use strict';
        var output, ws;
    
        //Display logging information in the document
        function log(s) {
            var p = document.createElement("p");
            p.style.wordWrap = "break-word";
            p.textContent = s;
            output.appendChild(p);
    
            //Also log information on the javascript console
            window.console.log(s);
        }
    
        //Send a message on the Websocket
        function sendMessage(msg) {
            console.log(ws.binaryType);
            ws.send(msg);
            console.log("Message sent");
        }
    
        //Initialize WebSocket connection and event handlers
        function setup() {
            output = document.getElementById("output");
            ws = new window.WebSocket("ws://localhost:9999/");
    
            //Listen for the connection open event then call the sendMessage function
            ws.onopen = function () {
                console.log("Connected");
                document.getElementById('fl').onchange = function() {
                    sendMessage(document.querySelector('input[type="file"]').files[0]);
                };
                sendMessage("Hello Galileo!");
            }
    
            //Listen for the close connection event
            ws.onclose = function (e) {
                if(this.readyState == 2){
                    console.log('Connection is closing (Closing Handshake).')
                }
                else if(this.readyState == 3){
                    console.log('Connection closed. Has been closed or could not be opened.')
                }
                else{
                    console.log('Unhandled ReadyState: ',this.readyState);
                }
                console.log("Disconnected: " + 
                           ' reason:' + e.reason + 
                           ' was clean:' + e.wasClean + 
                           ' code:' + e.code);
            }
    
            //Listen for connection errors
            ws.onerror = function (e) {
                console.log("Error: " + e);
            }
    
            //Listen for new messages arriving at the client
            ws.onmessage = function (e) {
                console.log("Message received: " + e.data);
                //Close the socket once one message has arrived
                ws.close();
            }
    
        }
        //Start running the example
        setup();
    
    })();
    

    HTML代码

    <!DOCTYPE html>
    <html>
    <head>
    <title>Websocket Echo Client</title>
    <meta charset="utf-8"/>
    </head>
    
    <body>
    <h2>Websocket Echo Client</h2>
    <div id="output"></div>
    <input type="file" id="fl"/>
    <script src="websocket.js"></script>
    
    </body>
    
    </html>

    服务器代码

    switch (opcode) {
            case opcodes.TEXT:
              this.payload = payload.toString("utf8");
              winston.log('info','Text:\r\n', this.payload);
              break;
            case opcodes.BINARY:
              console.log('info','File:\r\n', payload.toString("utf8"));
    

1 个答案:

答案 0 :(得分:0)

据我所知,您在服务器端接收的有效负载不包含有关该文件的元数据。我认为File对象被视为普通Blob,其中包含一些额外的元数据,而ws.send仅将其视为Blobit has no special handling for File)。

可以使用

访问元数据
document.querySelector('input[type="file"]').files[0].name
document.querySelector('input[type="file"]').files[0].size
document.querySelector('input[type="file"]').files[0].type

然后单独发送。