【问题标题】:How to recognise the arraybuffer is string or image?如何识别arraybuffer是字符串还是图像?
【发布时间】:2014-11-08 14:10:54
【问题描述】:

我们正在使用 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)识别为图像或字符串?

ImageIO.write(getSubImage(bufferedImage,width,height), "png", baos); byte[] 结果=baos.toByteArray();

【问题讨论】:

  • 图片是什么格式的?
  • 您需要将文件名、mime 类型等元数据与数据一起发送。
  • 你能给我发个例子吗?
  • 即使不发送 mime 类型,您也可以将魔法/签名用于图像类型 en.wikipedia.org/wiki/List_of_file_signatures
  • Websocket 通常使用 HTTP 作为底层传输层。因此,可以使用主要消息将 HTTP 标头附加到 HTTP 正文。方式服务器可以设置Content-Type,cookie或者你自己自定义的header。通常Content-Type(具有image/pngtext/plain 之类的值)就足够了,如果不是,那么自定义标头可以解决所有问题。您需要在服务器和客户端上使用的确切 API 主要取决于您使用的库。

标签: javascript image blob arraybuffer


【解决方案1】:

有两种方法。例如,如果您使用的是 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作为响应数据。

【讨论】:

  • 我需要使用 java 代码在服务器端添加标志。我已经更新了问题。
  • 更新了我的答案,但是,我现在没有办法验证它。
  • 或查看@technosaurus 对您的问题的评论,这与我的回答中提到的您使用的文件的一般特征基本相同。如果您使用有限类型的文件,这是一个不错的解决方案,就像您使用 png 的问题一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多