我需要使用对 Web 服务的 AJAX 请求将大量 16 位整数传输到客户端。该数组本质上是具有一些附加元数据的图像的灰度像素数据。
原始图像采用浏览器不支持的专有格式。典型图像为 2000 像素 x 4000 像素,因此该数组可以包含 8,000,000+ 16 位值。
发出一个 AJAX 请求并在一次响应中返回整个数组是否可以接受,还是我应该分成更小的 block 并分别请求每个 block ?如果在一个响应中传输整个数组是一种公认的做法,我是否必须在请求期间处理不可靠的连接(或者在浏览器中“开箱即用”)?
我们正在编写客户端和 Web 服务,因此我们的方法非常灵活。
最佳答案
正如其他人提到的,如果您在服务器中启用 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 )
关于c# - 将大型阵列传输到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15585491/