javascript - 如何使用angularjs处理文件下载错误?

标签 javascript angularjs iframe download

下载文件看起来很简单,但有很多可行的解决方案。 一直工作到服务器显示 401 UNAUTHORIZED我的要求很自然:

  • 在任何情况下都不能替换当前窗口。
  • 我不想打开一个新窗口,因为它没有意义。
  • 如果出现错误,必须向用户显示一些消息。

我尝试使用 iframe 作为链接的目标,希望在出现错误时得到通知。我知道我很天真。

  • 我可以想象在 iframe 中放置一些脚本来通知主页 onunload。它看起来有点复杂,所以我先问一下。
  • 我可以向服务器询问结果。这肯定会以某种方式起作用。但这也很复杂,因为存在时间问题并且 session 已过期,所以我必须规避这一点。

最佳答案

您可以使用 Blob对象触发文件从 javascript 下载。这是随文件 API 一起引入的,并且仍处于 工作草案 状态。 因此您将获得有限的浏览器支持。截至 2015 年,您拥有对 Blob URLs 的广泛浏览器支持。和 Blob Constructor .

<div ng-controller="appController" ng-app="app">
    <a ng-href="{{ fileUrl }}" download="file.txt">download</a>
</div>
var app = angular.module('app', []);

// Angular prepends "unsafe" tag in ng-href to prevent XSS
// so we need to sanitize this
app.config(['$compileProvider', function ($compileProvider) {
    // for Angular 1.0.x and 1.1.x, you should use urlSanitizationWhitelist
    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob|ftp):/);
}]);

app.controller('appController', function ($scope, $window) {
    // Creating a Blob with our data for download
    // this will parse the URL in ng-href such as: blob:http...
    var data = 'some data here...',
        blob = new Blob([data], { type: 'text/plain' }),
        url = $window.URL || $window.webkitURL;
    $scope.fileUrl = url.createObjectURL(blob);
});

查看 demo fiddle here .

有一些库可以扩展浏览器对此的支持,例如 Blob.js

您还应该查看 FileSaver.js这也回落到 data:URI

关于javascript - 如何使用angularjs处理文件下载错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848522/

相关文章:

javascript - 我想将 html id 绑定(bind)到指令中

javascript - 从 DOM 中删除尚未完全加载的图像 : is transmission aborted?

angularjs - 迁移到 Angular2 : How to use injected AngularJS dependencies

angularjs - PouchDB + Ionic 使用 WebSQL 而不是 SQLite

javascript - jQuery - 从 iframe 动态创建的元素上的事件绑定(bind)

html - iframe 全屏在 Chrome 中不起作用?

iframe - IE6 "position: fixed"解决方法在滚动时不适用于选择框

javascript - 设置元素背景的 alpha 值而不改变其 style.background 值

javascript - 设置自定义有效性 "Empty"

javascript - 无法设置未定义的属性 'backgroundSize'