通过Websockets将文件上传到Play Framework 2.0

Soc*_*ash 5 javascript jquery playframework-2.0

我正在使用Play Framework 2.0,Javascript和WebSockets.在示例中,我有一个AKKA演员,他知道所有的websockets.单个WebSockets.In有一个ListenerCallback对象,用于处理来自客户端的传入请求.在客户端,我有Javascript/jquery将以JSON序列化的公式数据发送到websocket.这对于简单输入非常有效.但现在我想对文件做同样的事情.所以我必须以某种方式将文件数据转换为JSON数据(例如base64).有人知道如何正确地做到这一点吗?我想在Javascript中"收集"该文件,然后通过JSON将其发送到websocket.我知道base64效率不高,如果有人有其他选择,请告诉我.

谢谢

Raf*_*ele 4

这是可能的,但是您必须使用WebSocketFileReaderAPI,它们仅在较新的浏览器上受支持。Javascript 现在有一种TypedArray数据类型,可用于传输字节。例如,给定以下 HTML:

\n\n
\xe2\x80\x8b<form>\n  <input type="file" id="picture" />\n</form>\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n\n

您需要观察文件change输入字段上的事件。在 Javascript 方面(jQuery):

\n\n
$("#picture").change(function(){\n    var reader = new FileReader;\n\n    reader.onloadend = function (bytes) {\n        var ws = new WebSocket("ws://host/path");\n        ws.send(bytes);        \n    }\n\n    reader.readAsArrayBuffer(this.files[0]);\n}\xe2\x80\x8b);\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n\n

WebSocket PDU 是最小化的框架(只有两个字节的标头),当您使用 WebSocket PDU 时send(),浏览器应该负责为二进制传输设置正确的操作码,并且在服务器上您应该能够读取原始字节流。我现在正在研究 Play API,以提供一个最小的工作示例。

\n