2016-04-06 12 views
0

我有如下的二进制使用在Tomcat 8网络套接字服务器:网页套接字API - 图像编码产生在客户端没有图像类型

sess.getBasicRemote().sendBinary(bf); 

其中Bf是字节转换一个简单的图像,如下所示:

BufferedImage img = ImageIO.read(...); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "png", baos); 
ByteBuffer bf = ByteBuffer.wrap(baos.toByteArray()); 

这段代码最终在客户端(JavaScript)中作为一个blob,并最终在浏览器中呈现为图像,这似乎工作得很好。 唯一奇怪的是,图像呈现无类型:
数据:; base64,iVBORw0KGgoAAAA ...... ==没有类型(image/png)。
如果我用网上的编码器对同一图像,我会得到:
数据:图像/ PNG; BASE64,iVBORw0KGgoAAAA ...... ==(注意,图像/ PNG型)

所以我的问题这是为什么? 是我的图像转换为字节错误?就像我说的那样,图像显示正常,它只是缺少类型。 请注意,从java websocket服务器发送的数据不是用base 64编码的,它是我在客户端执行的操作(通过JS的FileReader.readAsDataURL(blob) - 非常常见)。

非常感谢和很抱歉的帖子

回答

0

不,您的图像转换为字节数组没有错。字节数组转换将图像视为二进制流,它与其中包含的MediaType无关。

您想要查看的类型是Data URI媒体类型。 将文件转换为字节数组的正常java代码不会为您提供data URL scheme兼容URL。

从RFC

数据:;(有 可选参数)[<的MediaType >] [BASE64],

的<的MediaType >是因特网媒体类型规范的“外观; base64“意味着数据 被编码为base64。如果没有“; base64”,则数据(作为 八位字节的序列)使用ASCII编码表示 安全URL字符范围内的八位字节,并使用该范围之外的八位字节的URL的标准%xx十六进制编码 。如果<中介类型>被省略,则其 默认为text/plain; charset = US-ASCII。作为简写,可以省略 “text/plain”,但提供charset参数。

RFC source

当你创建在JavaScript中Blob对象,你有一个选项,这样,当你读它使用FileReader.readAsDataURL它填补了适当的介质类型来传递MediaType它。

例子如下

var blob = new Blob([ arrayBufferView ], { type: "image/jpeg" }); 

Source

你可能并不需要在你的代码BufferedImage,简单的文件读取就足够了。

以下相当于您的代码与Apache FileUtils

ByteBuffer bf = ByteBuffer.wrap(FileUtils.readFileToByteArray('test.jpg')); 
+0

嗨,谢谢你的精心和快速的回​​应。 blob出现在websocket的客户端,并检查这个blob没有媒体类型那里...所以我不能确定在客户端什么是媒体类型...我想我应该根本不使用二进制,我会用在java服务器端的json字符串,并添加一个类型属性加base64编码字节数组在另一个属性。这是我能想到的唯一解决方案。再次感谢! – user1061835

+0

不客气,是的,这似乎是一种更好的方式,或者可以使用适当的媒体类型在服务器上创建数据URL字符串。 – 11thdimension