この質問は数ヶ月前ですが、最初にSpring Sessionを使用したときにAngularJSでこの問題が発生しました。ちょっとハッキリですが、基本的にAngularJSのHTTPを使用してドキュメントを取得し、ブラウザのBLOBに保存します。次に、隠した<a>
タグがBLOBへのリンクと共に作成され、リンクがプログラムによってクリックされます。私はこれを扱う「saveBlob」と呼ばれるAngularJSのサービスがあります。
app.service('saveBlob', ['$http', function ($http) {
return {
download: function(url, fileName) {
$http.get(url, { responseType: 'arraybuffer' }).then(function(response) {
var blob = new Blob(
[ response.data ],
{ type: response.headers('Content-Type') }
);
var objUrl = window.URL.createObjectURL(blob);
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = objUrl;
if (fileName) {
a.download = fileName;
}
else {
var regex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g;
var match = regex.exec(response.headers('Content-Disposition'));
var fn = match[1];
a.download = fn.substring(1, fn.length - 1);
}
a.click();
window.URL.revokeObjectURL(url);
});
}
}
}]);
「saveBlob」サービスは、その後、「httpHref」と呼ばれるディレクティブによって呼び出されます。
app.directive('httpHref', ['$http', 'saveBlob', function ($http, saveBlob) {
return {
link: function ($scope, elem, attrs) {
function revokeObjectURL() {
if ($scope.objectURL) {
URL.revokeObjectURL($scope.objectURL);
}
}
$scope.$watch('objectURL', function (objectURL) {
elem.attr('href', objectURL);
});
$scope.$on('$destroy', function() {
revokeObjectURL();
});
attrs.$observe('httpHref', function (url) {
elem[0].onclick = function() {
saveBlob.download(url);
};
});
}
};
}]);
私は(This GitHub Repositoryからこのコードを適応しましたこれはMITライセンスの下でライセンスされています)、これを手伝ってくれたプロジェクトの貢献者に感謝します!
誰かに役立つかもしれませんが、私はAureliaに移行しましたが、これをaurelia/fetch apiに変換する方法を見つけることができたと確信しています – xenoterracide