我使用spring会话生成的x-auth-token
来维护通信,这对ajax请求来说很好。不过,我有一个问题,我有而不是的文件,目前正由ajax获取。
这些文件是用户上传的内容、pdf、带有css和字体的html,基本上是浏览器可以渲染的东西,所以制作ajax强制下载按钮不是一个选项(尽管可能有一种方法可以查看它们,但我没有想到)。目前,它们只是由浏览器GET通过<a href
链接请求的,因此不包括标头。
我正在使用AngularJS。解决这个问题的最佳方法是什么?
我知道这个问题已经存在几个月了,但当我第一次使用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);
});
}
}
}]);
然后,名为"httpHref"的指令调用"saveBlob"服务:
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);
};
});
}
};
}]);
我从这个GitHub存储库(根据麻省理工学院许可证授权)中改编了这段代码,所以感谢该项目的贡献者帮助我!