我正在使用Spring websockets(STOMP作为子协议)和Sockjs开发消息传递应用程序。
我应该支持在邮件中发送文件。
根据this ticket,sockjs不支持二进制数据,但是STOMP不支持。
我知道我们可以将图像转换为base64并通过stomp发送它,但我认为这不是最好的做法,因为有很多转换和开销。此外,我必须保存消息,所以要再次在服务器上保存这个base64编码文件,我将不得不解码它们。
我有几个问题:
1)是否有通过sockjs发送图像/文件的解决方法+ stomp 或转换为Base64是唯一的方法?
2)这可能是一个非常愚蠢的问题,但根据this question,可以通过STOMP发送二进制数据(没有sockjs)。没有sockjs支持后备有多困难?
谢谢。
编辑:如果使用base64是唯一选项,我宁愿发出POST请求来保存包含附件的邮件,而不是使用base64编码。任何更好的想法?
答案 0 :(得分:5)
任何Web Socket实现都将处理二进制数据(如果它是base64编码的)。这基本上将二进制流序列化为字符串。所有套接字传输和包装器都可以处理字符串数据。任何Java base64实现都应该有效。
在浏览器端,base64在btoa()
和atob()
的现代浏览器中原生处理。如果您支持旧版浏览器,则可能需要填充。
也就是说,如果Java服务器只是在Web用户之间代理消息,那么您不需要在Java中解码图像,您只需将字符串编码图像从一个套接字连接传递到另一个套接字连接。
答案 1 :(得分:0)
你看看binaryjs。它承诺使用websockets实现Web的实时二进制流。
让我们查看示例
https://github.com/binaryjs/binaryjs/tree/master/examples
您应该检查Atmosphere(wasync),链接将指导您如何实施。
据了解客户端的浏览器回退场景,您可以使用[base64 polyfill lib(https://github.com/davidchambers/Base64.js/)。
最好的问候
答案 2 :(得分:0)
另一种选择是仅使用WebRTC发送二进制图像。对此的一个优点是这些消息纯粹是点对点的。您只需要在Web应用程序中实现此功能,而不是在后端。然后,您不需要为图像使用的带宽付费。不幸的是,IE不支持WebRTC。