我们使用websocket以bytearray传输数据。在接收端,javascript必须确定收到的ArrayBuffer是String类型还是Image类型。如果是String,则转换为String,否则转换为Blob。如下所示,除了我不知道如何识别arraybuffer是字符串或图像。
if (message instanceof ArrayBuffer) {
if(message of type string)
var bytearray = new Uint8Array(message);
to convert to string
var out = String.fromCharCode.apply(null, bytearray);
console.log(out);
}
if(message of type image){
imageId.height = 400;
imageId.width = 600;
imageId.src = convertArrayBufferBlobUrl(message);
}
更新
从服务器我将发送图像作为以下java代码。如何在字节数组中追加或添加标志以通过客户端浏览器(javascript)识别为图像或字符串?
ImageIO.write(getSubImage(bufferedImage,width,height),“png”,baos); byte [] result = baos.toByteArray();
答案 0 :(得分:2)
有两种方法。例如,如果您使用的是JPEG文件类型,则可以通过它的一般特征识别JPEG格式:
http://www.fileformat.info/format/jpeg/corion.htm
How to identify contents of a byte[] is a jpeg?
现在,这是一种有效的方法,但你必须为每种图像类型编写一个,这很乏味。
现在这个:How to check if a byte array is a valid image?也可以使用,是另一个有效的答案,但是会遇到将数据转换为图像的开销。
@dandavis建议的一个好选择是使用一些元数据,如服务器端的标志。
例如:
if(<data is image>)
result=json_encode(array[flag,data])
并将结果发送回客户端。标志可能对图像说'是',对于字符串可以说'不',或者1和0或任何你觉得有吸引力的对。
<强>更新强> 看看这个
import net.sf.json.JSONArray;
ImageIO.write(getSubImage(bufferedImage,width,height), "png", baos );
byte[] result=baos.toByteArray();
JSONObject obj = new JSONObject();
obj.put("imgFlag","true");
obj.put("imgData", result);
但是,放置字节数组本身可能并不容易。
我的建议是尝试将字节数组作为json值,但是如果它不起作用,首先将字节数组result
转换为base64字符串,如下所示:Put byte array to JSON and vice versa
......并做同样的事。
您可以通过将obj转换为JSON字符串来发送数据。
String jsonData=obj.toString();
并发送jsonData作为响应数据。