在AngularJS中,有$http.get动态获取数据.遗憾的是,从官方文档中不易理解如何读取二进制数据(例如,用于图像处理).
默认值get将数据提取为a String(在plunker中查看).这非常麻烦.那么,如何在ArrayBuffer中获取它?(注意,因为XHR2 已经可以了.)
<!DOCTYPE html>
<html>
<head>
<title>Using $http.get to read binary data</title>
</head>
<body ng-app>
<h1>$http to load binary data</h1>
<div ng-controller="FetchCtrl" >
<button ng-click="fetch()">fetch</button><br/>
{{info}}
</div>
<script src="http://code.angularjs.org/1.0.6/angular.min.js"></script>
<script>
// Controller
function FetchCtrl($scope, $http) {
// See note 1
$scope.URL = "http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png";
$scope.info = "Click 'fetch' to fetch an image" ;
$scope.fetch = function() {
delete $http.defaults.headers.common['X-Requested-With']; // See note 2
$http.get($scope.URL).
success(function(data) {
$scope.info …Run Code Online (Sandbox Code Playgroud) 我们正在实现一个客户端Web应用程序,它通过XMLHttpRequests(和AJAX引擎)专门与服务器通信.
XHR响应通常是纯文本,上面有一些XML,但在这种情况下,服务器正在发送.tgz文件类型的压缩数据.我们确定服务器发送的数据是正确的,因为如果我们使用诸如curl的HTTP命令行客户端,则作为响应发送的文件是有效的并且包含预期的数据.
但是,当在可下载文件中进行AJAX调用并"响应"响应时,我们获得的文件的大小(更高)与正确的文件不同,并且解析器无法识别它.它给出以下错误:
gzip: stdin: not in gzip format
/bin/gtar: Child returned status 1
/bin/gtar: Error is not recoverable: exiting now
Run Code Online (Sandbox Code Playgroud)
我正在使用的代码如下:
*$.AJAX*.done(function(data){
window.URL = window.webkitURL || window.URL;
var contentType = 'application/x-compressed-tar';
var file = new Blob([data], {type: contentType});
var a = document.createElement('a'),
ev = document.createEvent("MouseEvents");
a.download = "browser_download2.tgz";
a.href = window.URL.createObjectURL(file);
ev.initMouseEvent("click", true, false, self, 0, 0, 0, 0, 0,
false, false, false, false, 0, null);
a.dispatchEvent(ev);
});
Run Code Online (Sandbox Code Playgroud)
我避免了用于进行AJAX调用的参数,但我们假设这不是问题,因为我正确地收到了答案.我使用了这个contentType,因为它与curl获得的相同,但我尝试了不同的内容.代码可能看起来有点怪异,所以我会为你解毒它:我基本上是创建一个链接,我附加了它的下载链接和文件的名称(这是一个肮脏的方式来命名文件).最后,我实际上是点击链接.
我将正确的tgz文件和通过浏览器获得的文件与十六进制查看器进行了比较,我观察到了损坏的文件(EF,BF和BD,整个文件)中重复的模式,这些模式在正确的模式中不存在.
因此,我想一些可能的原因:
(a)浏览器正在添加额外的字符,或者响应头仍然在下载的文件中.
(b)文件已被部分解压缩,因为当我检查请求标题时,我可以说"Accept-Encoding:gzip,deflate"; 虽然我不知道浏览器(在我的情况下是Firefox)是否会自动解压缩数据.
(c)我用来填充数据的代码不正确; 虽然它在另一个场合用普通/文本文件很好地完成了目标.
编辑
我还为您提供了十六进制检查的链接:
(a)文件损坏: …