Angularjs 使用angular从flask提供令牌保护的文件 我有一个文件,由flask提供,以令牌为基础进行保护 认证 我想从angular应用程序下载它 令牌存储在angular会话中,并放入每个$http.get或post的头中

Angularjs 使用angular从flask提供令牌保护的文件 我有一个文件,由flask提供,以令牌为基础进行保护 认证 我想从angular应用程序下载它 令牌存储在angular会话中,并放入每个$http.get或post的头中,angularjs,download,flask,token,flask-security,Angularjs,Download,Flask,Token,Flask Security,但是,当我只是放置一个指向flask路径的链接时,令牌不会添加到请求头中,因为它不是$http.get(),而是一个普通的锚,我不能这样做(对吧?) 我不想将url中的令牌作为查询字符串参数传递。 如何向用户提供下载?我应该先将$http.get()放入angular中,然后通过隧道将其作为文件下载吗 登录后的令牌存储: $window.sessionStorage.token = results.response.user.authentication_token; 它被注入到每个$http

但是,当我只是放置一个指向flask路径的链接时,令牌不会添加到请求头中,因为它不是$http.get(),而是一个普通的锚,我不能这样做(对吧?)

我不想将url中的令牌作为查询字符串参数传递。 如何向用户提供下载?我应该先将$http.get()放入angular中,然后通过隧道将其作为文件下载吗

登录后的令牌存储:

$window.sessionStorage.token = results.response.user.authentication_token;
它被注入到每个$http get或post中:

config.headers['Authentication-Token'] = $window.sessionStorage.getItem('token');
烧瓶(带烧瓶安全装置)部分:


如何解决此问题?

首先通过$http.get()获取数据

我发现有两种方法:

  • 将数据作为base64编码的数据插入href属性中

  • 将数据作为javascript blob插入,并在 href属性

  • 第一种方法是由@Christian在评论中推荐的。 我实现了它,您可以在下面找到代码。然而,该方法使Chrome崩溃,无法处理较大的文件(本例中为csv文件),显然这是错误的。 所以我推荐方法2

    方法2 角度(对于本例中的csv文件,相应地更改其他文件的类型:“text/csv”:

    $http.get('/downloadpath').
        success(function(downloadresult){
            fileData = new Blob([downloadresult], { type: 'text/csv' }); 
            fileUrl = URL.createObjectURL(fileData);
            $scope.download_href = fileUrl;
        });
    
    HTML:

    作为补充,这里是方法1:

    var app = angular.module('myApp', []);
    
    app.config( [
        '$compileProvider',
        function( $compileProvider )
        {   
            $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|data|blob):/);
        }
    ]);
    
    方法1 对于html,也一样:

    <a href="{{download_href}}" download="filename.ext">download</a>
    
    两种方法的角度要求 您需要将方法2的blob协议和方法1的数据协议列为白名单:

    var app = angular.module('myApp', []);
    
    app.config( [
        '$compileProvider',
        function( $compileProvider )
        {   
            $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|data|blob):/);
        }
    ]);
    

    看看这个解决方案。不过只适用于HTML5。谢谢!这是一个很好的技巧,我很快就会写出答案
     $http.get('/downloadpath').
        success(function(downloadresult){
            $scope.download_href = downloadresult;
        });
    
    <a href="{{download_href}}" download="filename.ext">download</a>
    
    @app.route("/downloadpath", methods=['GET'])
    @auth_token_required
    def download():
        encoded = base64.b64encode(open('export.csv','br').read())
        response = 'data:text/csv;base64,{}'.format(str(encoded, encoding='utf-8'))
        return response
    
    var app = angular.module('myApp', []);
    
    app.config( [
        '$compileProvider',
        function( $compileProvider )
        {   
            $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|data|blob):/);
        }
    ]);