5

我需要使用对 Web 服务的 AJAX 请求将大量 16 位整数数组传输到客户端。该数组本质上是带有一些附加元数据的图像的灰度像素数据。

原始图像采用浏览器不支持的专有格式。典型的图像是 2000 像素 x 4000 像素,因此该数组可以包含 8,000,000+ 16 位值。

发出一个 AJAX 请求并在一个响应中返回整个数组是否可以接受,还是应该分成更小的块并单独请求?如果在一个响应中传输整个数组是一种公认​​的做法,我是否必须在请求期间处理不可靠的连接(或者这是否在浏览器中“开箱即用”)?

我们正在编写客户端和 Web 服务,因此我们的方法完全灵活。

4

2 回答 2

1

就像其他人提到的,如果您在服务器中启用 gzip 压缩传输,浏览器应该会自动解压缩图像。如果图像是具有大面积相同颜色的扫描文档,这实际上可以压缩图像很多;如果它更像是一张航拍照片,那么就没有那么多了。

现在您在客户端有了图像,您还有另一个问题:如何处理这 800 万个 16 位像素。

在我们输入数组之前,我们必须使用字符串来表示任意数据。这比听起来更安全,因为在 JavaScript 中字符串是 16 位代码单元的序列,可以解释为以 UTF-16 编码的文本。JavaScript 对编码无效的字符串完全没有问题。

这意味着您可以将图像存储为一个长字符串,并使用charCodeAt. 对于大多数操作目的,这应该相当快。

这是一个将 16 位二进制数据(实际上是 PNG 图标)加载到字符串中并输出前 16 个元素的示例:

$.ajax({
    url:"http://fiddle.jshell.net/favicon.png",
    success: function(data) {
        // Now we have the data, let's show it:
        var out = "";
        for (var i = 0; i < 16; i++) {
            out += ","+data.charCodeAt(i).toString(16);
        }
        console.log(out.substring(1));
    },
    beforeSend: function ( xhr ) {
        xhr.overrideMimeType("text/plain; charset=utf-16be");
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log("ERROR: "+textStatus+" "+errorThrown);
        console.log(jqXHR);
    },
})

(在jsfiddle上的实时示例)

于 2013-03-23T19:12:28.667 回答
0

您需要传输的数据大小超过 16 MB,但考虑到您正在处理未归档的数据,您应该使用 gzip 获得更小的大小。您还应该考虑一种非常快速的序列化格式(因为您需要在客户端和服务器上进行大量处理来序列化/反序列化数据)。

于 2013-03-23T10:18:40.063 回答