Javascript AngularJS:将二进制数据从ArrayBuffer放入服务器
好的,我试着读一个PDF文件,如下所示: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
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);
您的请求中有两个问题
data
应该是newdataview(data)
或newuint8array(data)
等
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字节数组作为它需要的几个参数之一。