Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在一个AJAX响应中接收多个二进制值?_Javascript_Json_Ajax_Binaryfiles - Fatal编程技术网

Javascript 如何在一个AJAX响应中接收多个二进制值?

Javascript 如何在一个AJAX响应中接收多个二进制值?,javascript,json,ajax,binaryfiles,Javascript,Json,Ajax,Binaryfiles,目标是发送要从服务器检索的项目列表,服务器查询文件系统或数据库,理想情况下返回一个二进制文件数组 我目前的方法是将二进制代码base64编码到JSON数组中 // Extend Array class methods to NodeList data type Object.getOwnPropertyNames( Array.prototype ).forEach( function(method){ if (method !== 'length') NodeList.protot

目标是发送要从服务器检索的项目列表,服务器查询文件系统或数据库,理想情况下返回一个二进制文件数组

我目前的方法是将二进制代码base64编码到JSON数组中

// Extend Array class methods to NodeList data type
Object.getOwnPropertyNames( Array.prototype ).forEach( function(method){
  if (method !== 'length')
    NodeList.prototype[method]=Array.prototype[method];
});

// Find People
var nodeList = document.querySelectorAll('div.people');
var people   = nodeList.map(function(el){ return el.dataset.personid; });

// Search Server
var request    = new XMLHttpRequest();
var skip_cache = '?' + new Date().getTime();
request.open('POST', 'cgi.script' + skip_cache );
request.responseType = 'json';
request.onload = function(){
  // response handler
  /* receives json from server, including an array of base64 files for each person 
     loop over array and append base64 values to images (data uri) and prepare other HTML elements 
  */
};
request.send( JSON.stringify({ids:people}) );
瓶颈是请求的大小——我已经将人数分成多个请求。尽管如此,base64在未压缩状态下仅大约37%;当你有1k文件要下载时,这并不重要

我们的目标是减少每个请求的大小(不牺牲时间),这可以归结为更好的压缩方法(lzma vs gzip)或改进数据格式(二进制优于ascii)


是否可以一次传输多个二进制文件,或者甚至直接将它们嵌入JSON而不产生副作用?作为预防措施,我从未尝试过这样做,因为我想到了可能会对过去的技术造成挑战的副作用。

发出多部分请求会解决您的问题吗?@kazenorin我只在将文件附加到电子邮件或将数据发布到服务器时使用多部分;从不从服务器接收文件。这很普遍吗?如果是这样,那么我想是的,这可能是我所需要的。我只想在同一条消息中传输多个二进制文件,而不想过于聪明(打包一个八位字节字符串或自定义tar/zip)。@kazenorin我看到了这个:,它只是想巧妙地格式化一个带有头的字符串,并在必要时进行解析。这不会比一个好的JSON模式更有用。因此,它看起来不像是处理二进制数据的。不需要多部分-它不太受支持,您仍然存在编码问题。。。相反,只需执行一个纯协议。例如,发送文件数,然后发送文件名长度、文件名、文件长度、每个文件的文件。@Amadan您知道是否有任何示例吗?我最近一直在询问ArrayBuffer,但没有看到任何更高级的示例。我假设您建议使用两种不同的请求:(1)请求元数据(2)将服务器上的缓冲区与所有文件打包;在客户机中,使用元数据拼接缓冲区。