1

Websocket クライアント コードがあり、それを介してファイルをアップロードすると、Web ソケット サーバーがファイルを受け取ります。しかし、サイズは常にゼロです。tootallnate の Java-Websocket サーバーを使用しています。以下は私のクライアントコードです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chat</title>
<script type="text/javascript" src="/MyHomePage/jquery-2.0.3.min.js">    </script>
</head>
<body>
  <h2>File Upload</h2>
   Select file
   <input type="file" id="filename" />
   <br>
<input type="button" value="Connect" onclick="connectChatServer()" />
<br>
<input type="button" value="Upload" onclick="sendFile()" />
<script>
    var ws;

    function connectChatServer() {
        ws = new WebSocket(
                "ws://localhost:8887/");

        ws.binaryType = "arraybuffer";
        ws.onopen = function() {
            alert("Connected.")
        };

        ws.onmessage = function(evt) {
            alert(evt.msg);
        };

        ws.onclose = function() {
            alert("Connection is closed...");
        };
        ws.onerror = function(e) {
            alert(e.msg);
        }

    }

    function sendFile() {
        var file = document.getElementById('filename').files[0];
        ws.send('filename:'+file.name);
        var reader = new FileReader();
        var rawData = new ArrayBuffer();            
        //alert(file.name);

        reader.loadend = function() {

        }
        reader.onload = function(e) {
            rawData = e.target.result;
            ws.send(rawData);
            alert("the File has been transferred.")
            ws.send('end');
        }

        reader.readAsArrayBuffer(file);

    }


</script>

以下は私のWebソケットサーバーコードです。

@Override
public void onMessage(WebSocket conn, String message) {
    System.out.println("received message from " + conn.getRemoteSocketAddress() + ": " + message);
    if (!message.equals("end")) {
        fileName = message.substring(message.indexOf(':') + 1);
        uploadedFile = new File(filePath + fileName);
        try {
            fos = new FileOutputStream(uploadedFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    } else {
        try {
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void onMessage(WebSocket conn, ByteBuffer message) {
    System.out.println("Binary Data");

    while (message.hasRemaining()) {
        try {
            fos.write(message.get());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ご意見をお聞かせください。

4

1 に答える 1

0

ファイルサイズがバッファサイズよりも大きい場合、ソリューションは失敗します。

       function sendFile() { 
       var file = document.getElementById('filename').files[0];
            var start=0;
             var end=file.size;


             while(start < end){

                var next=start+8192;//8192 is buffer size
                if(end < next){
                 var blob1=file.slice(start,end);
                 websocket.send(blob1);
                 start=end;
                }else{
                var blob1=file.slice(start,next);
                 websocket.send(blob1);
                 start=next;
                }

                var stat=(start/end)*100;




             }

    }

ブラウザーが動かなくなるため、Web Workers を使用して sendFile() 関数を実装します。
サーバー側で初めて開く

          FileOutputStream fos= new FileOutputStream("Path");
           fc.write(message);
           conn.getUserProperties().put("FileChannel", fos.getChannel());

2回目

          FileChannel fc=conn.getUserProperties().get("FileChannel");
          fc.write(message);

最後に FileChannel を閉じます

于 2015-12-15T06:07:35.927 に答える