Javascript 如何识别arraybuffer是字符串还是图像?

Javascript 如何识别arraybuffer是字符串还是图像?,javascript,image,blob,arraybuffer,Javascript,Image,Blob,Arraybuffer,我们正在使用websocket在bytearray中传输数据。在接收端,javascript必须确定接收的ArrayBuffer类型是String还是Image。如果是字符串,则转换为字符串,否则转换为Blob。如下所示,只是我不知道如何识别arraybuffer是字符串还是图像 if (message instanceof ArrayBuffer) { if(message of type string) var bytearray = new Uint8A

我们正在使用websocket在bytearray中传输数据。在接收端,javascript必须确定接收的ArrayBuffer类型是String还是Image。如果是字符串,则转换为字符串,否则转换为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)中将其标识为图像或字符串

写入(getSubImage(buffereImage,宽度,高度),“png”,baos);
字节[]结果=baos.toByteArray()

有两种方法。例如,如果您使用的是JPEG文件类型,则可以通过其一般特征来识别JPEG格式:

现在,这是一种有效的方法,但是你必须为每种图像类型编写一个程序,这是很乏味的

现在,this:也可以使用,这是另一个有效的答案,但它存在将数据转换为图像的开销

@dandavis建议的一个好选择是使用一些元数据,比如服务器端的标志

例如:

然而,将字节数组本身放入内存可能并不容易。 我的建议是尝试将字节数组作为json值,但如果它不起作用,请首先将字节数组
结果
转换为base64字符串,如下所示:

…也要这样做

您可以通过将obj转换为JSON字符串来发送数据

String jsonData=obj.toString();

并发送jsonData作为响应数据。

图像的格式是什么?您需要随数据一起发送元数据,如文件名、mime类型等。您可以给我发送一个示例吗?即使不发送mime类型,您也可以使用图像类型的魔法/签名Websocket通常使用HTTP作为传输层的基础。因此,可以使用主消息将HTTP头附加到HTTP正文中。服务器可以设置
内容类型
、cookie或您自己的自定义标题。通常
内容类型
(具有
图像/png
文本/plain
等值)就足够了,如果不够,则自定义标题可以解决所有问题。您需要在服务器和客户机上使用的确切API主要取决于您使用的库。我已经更新了问题。更新了我的答案,但是,我现在没有办法验证。或者检查@technosaurus对你的问题的评论,这与我在回答中提到的你正在使用的文件的一般特征基本相同。如果您使用的是有限类型的文件,这是一个确定的解决方案,就像您使用png的问题一样。
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);
String jsonData=obj.toString();