Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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 AngularJS:将二进制数据从ArrayBuffer放入服务器_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS:将二进制数据从ArrayBuffer放入服务器

Javascript AngularJS:将二进制数据从ArrayBuffer放入服务器,javascript,angularjs,Javascript,Angularjs,好的,我试着读一个PDF文件,如下所示: reader.readAsArrayBuffer(file); 然后尝试使用$http将其发送到服务器,如下所示: $http.put(url, data, {headers: {'Content-Type': 'application/pdf'}}); 因此,只需读取并以原始形式将二进制文件发送到服务器。根据我找到的一些资源,将数组缓冲传递给XHR应该可以,但将其作为数据传递给$http只会导致请求正文,如下所示:{}和内容长度=2 读取文件rea

好的,我试着读一个PDF文件,如下所示:

reader.readAsArrayBuffer(file);
然后尝试使用
$http
将其发送到服务器,如下所示:

$http.put(url, data, {headers: {'Content-Type': 'application/pdf'}});
因此,只需读取并以原始形式将二进制文件发送到服务器。根据我找到的一些资源,将数组缓冲传递给
XHR
应该可以,但将其作为数据传递给
$http
只会导致请求
正文
,如下所示:
{}
内容长度=2

读取文件
readAsBinaryString()
会导致文件损坏(显然正是由于这个原因,该文件已被弃用)

用例对我来说太微不足道了,我是否遗漏了什么


Chrome 36,Angular 1.2.20是否因为您只是将$http方法处理为数组缓冲区,而不是将该缓冲区写入字节数组?如果是这样的话,您发布到服务器的内容可能只是arraybuffer对象

查看这篇文章,了解如何将ArrayBuffer写入字节数组:
您必须使用
reader.readAsArrayBuffer(文件)
然后在
onload
回调中根据结果创建
ArrayBufferView

new Uint8Array(reader.result)
将该数据传递到
$http
并覆盖
transformRequest
属性,以便angularjs不会将数组编码为json:

reader.onload = function() {
    $http({
        method: 'PUT', 
        headers: {'Content-Type': 'application/pdf'}, 
        data: new Uint8Array(reader.result), 
        transformRequest: []
    })
};
reader.readAsArrayBuffer(file);

您的请求中有两个问题

  • 您需要为$http函数提供一个数据视图
  • 因此,
    data
    应该是
    newdataview(data)
    newuint8array(data)

  • $http始终尝试将数据作为json发送。如果重写变换函数,则可以防止出现这种情况。transform函数是负责将二进制文件转换为json的代理
  • 因此,您应该将
    transformRequest:[]
    属性添加到您的请求中

    例如:

    var request = $http({
                            method: 'PUT',
                            url: 'example.com',
                            data: new Uint8Array(data),
                            headers: {'Content-Type': 'application/octet-stream'},  
                            transformRequest: [],
                            responseType: 'arraybuffer'
                        });
    

    几乎可以,但如果不覆盖
    transformRequest
    它仍然无法工作。AngularJS将所有内容编码为json是否只是标准行为?我不明白为什么要将字节数组编码为json数据。@tbaetz:我用它敲了将近两天的脑袋。。。谢谢你的回答。@tbaetz:半天的工作,终于被你的解决方案挽救了。你太棒了,伙计。除了二进制之外,把其他参数/元数据传递给WebAPI方法怎么样?我的方法将PDF字节数组作为它需要的几个参数之一。