Como baixar um arquivo zip no AngularJS / FilesaverJS [duplicado]
Esta pergunta já tem uma resposta aqui:
rquivos binários corrompidos - Como baixar arquivos binários com o AngularJS 2 respostastenho uma função de serviço que me devolve 3 arquivos de resultados (2 arquivos de texto, 1 arquivo zip
quero verificar o cabeçalho da resposta para ver se o arquivo é um zip ou um texto para definir a configuração correta para fazer o download do arquiv
@my controller resolveu a promessa do meu serviço. se eu baixar um arquivo de texto -> o arquivo diz [objeto objeto] ..
vi no meu navegador que o corpo da resposta é do tipo de conteúdo: text / plain
estou um pouco confuso: /
controller:
$scope.getResult = function(rid) {
console.log($scope.id);
GetResultFile.getResult($scope.id, rid)
.then(function (data, headers) {
//console.log(headers(Content-type));
console.log("Download erfolgreich");
console.log(data.status);
var file = new Blob([data], {type: 'text/plain;charset=utf-8'});
FileSaver.saveAs(file, 'test.txt');
}, function (data) {
console.log("Download ERROR!");
console.log(data.status);
})
};
serviço
.factory('GetResultFile',
['$http', '$q',
function ($http, $q) {
var service = {};
service.getResult = function(id, rid) {
var deferred = $q.defer();
$http
.get('http://localhost:9999/v1/jmeter/' + id + '/results/' + rid, {cache: false})
.then(function(data, status, headers, config) {
if(data.status == 200) {
console.log(data.status);
deferred.resolve(data);
}
else {
deferred.reject(data);
}
});
return deferred.promise;
}
return service;
Visão
<span ng-show="dataTable">
<table>
<tr ng-repeat="r in results">
<td><a href="" ng-click="getResult(r.id)" download>{{r.name}}</a></td>
</tr>
</table>
</span>
Atualizar
este é o meu serviço em que defino o tipo de resposta como arraybuffer
.factory('GetZip',
['$http', '$q',
function ($http, $q) {
var service = {};
service.getZip = function(id, rId) {
var deferred = $q.defer();
$http
.get('http://localhost:9999/v1/jmeter/' + id + '/results/' + rId, {cache: false, responseType: 'arraybuffer'})
.then(function(response) {
if(response.status == 200) {
console.log(response.status);
deferred.resolve(response);
}
else {
deferred.reject(response);
}
});
return deferred.promise;
}
return service;
sta é minha chamada no controlador:
$scope.getResult = function(rId, rName) {
console.log($scope.id);
console.log(rName);
GetResultFile.getResult($scope.id, rId)
.then(function(response) {
var data = "";
var headerType = "";
data = response.data;
headerType = response.headers('content-type');
console.log(response.headers('content-type'));
console.log("Download erfolgreich");
console.log(response);
// zip data need to be handle with a binary stream
if(headerType == 'application/zip;charset=UTF-8') {
GetZip.getZip($scope.id, rId)
.then(function(response) {
var file = new Blob([response.data], {type: "application/octet-stream"});
FileSaver.saveAs(file, rName);
console.log("zipper");
}, function(response) {
console.log("Download ERROR");
console.log(response.status);
})
} else {
var file = new Blob([data], {type: headerType});
FileSaver.saveAs(file, rName);
console.log("else");
}
}, function(response) {
console.log("Download ERROR!");
console.log(response.status);
})
};
}])
mas se eu baixar o arquivo zip, ele ainda está corrompido e um erro ao extrair o zip -.-