使用Angular通过Ajax下载文件
本文关键字:下载 文件 Ajax 通过 Angular 使用 | 更新日期: 2023-09-27 18:18:39
我有一个服务,它生成一个CSV文件,并通过http/ajax get将其返回到页面。我希望用户点击按钮,调用服务,然后将文件下载到用户的浏览器。
我想用Angular的方式来做这件事,尽管我意识到这可能更多地与Ajax或浏览器有关,而不是Angular本身。
服务是用c#编写的,它返回的结果如下:
return File(Encoding.UTF8.GetBytes(WriteCSV(assetList)), "text/csv", "results.csv");
调用服务的控制器代码如下所示。它是有效的,但我不知道成功后该怎么做:
$scope.exportCSV = function () {
$http({
method: "get",
url: "ExportCSV"
}).
error(function (data, status, headers, config) {
alert("Error exporting data to CSV.");
});
};
你不能从一个普通的ajax GET或POST启动下载,你必须做传统的方式,例如window.location='url'
和设置正确的http头与正确的内容类型,这将提示下载对话框在用户的浏览器
一种更‘angular’的方式可能是让你的控制器设置一个触发下载的标志,但将核心功能放在一个指令中,该指令构建了一个带有"download"属性的元素,并在显示时,一个回调/观察调用ng-click。
例如:// put this in a template related to a given controller
<downloader ng-if="downloadready"></downloader>
// controller just needs to trigger the directive into action
module.controller(..., function($scope){
$scope.downloadready = true; // trigger the directive to be created
});
// and the directive code will build the element and click the button
module.directive('downloader', function ($compile) {
return {
restrict: 'E',
replace: true,
// values here can be placed in the template as variables and accessed in link()
// but this is shortest to get the idea across
template: '<a id="downloadbtn" class="btn" download="backup.json"></a>',
link:function (scope, elm, attrs) {
// this clicks the button outside the digest loop which the scope was updated in
$timeout(function() {
angular.element($('#downloadbtn')).triggerHandler('click');
}, 0);
}
}
});
虽然我承认,这比在window.location.