0

我有一个简单的角度应用程序,其配置如下 -

angular.module('app',['ngResource','ngRoute','ui.bootstrap','angularFileUpload']);

angular.module('app').config(function($routeProvider,$locationProvider){
    $locationProvider.html5Mode(true);        
    $routeProvider
        .when('/', { templateUrl: '/partials/main/main', controller: 'mainCtrl'})
        .when('/browse/notes', { templateUrl: '/partials/notes/browseNotes',
            controller: 'browseNotesCtrl'
        })
        .when('/upload/notes', { templateUrl: '/partials/notes/uploadNotes',
            controller: 'uploadNotesCtrl'
        })
        .when('/profile',{ templateUrl:'/partials/account/mvProfile',
            controller: 'mvProfileCtrl' 
        }).when('/browse/notes/:noteId',{ templateUrl:'/partials/notes/noteDetail',
            controller: 'mvNoteDetailsCtrl' 
        });
});

现在,我的 noteDetail 部分有内容 -

ol
    li(ng-repeat="n in range(note.actualFileName.length)")
    a(ng-click="download(n)") {{note.actualFileName[n]}}

控制器有代码 -

$scope.download = function(n){
        console.log(n);
        var downloadUrl = '/download/note/' + $scope.note.noteId + '/' + $scope.note.storedFileName[n];
        $http({method:'GET',url:downloadUrl}).success(function(data,status,headers,config){
            console.log(status);
            console.log(data);
        });
    }

我在nodejs中的服务器端路由配置如下 -

app.get('/download/note/:noteid/:fileid',notes.download);

和 notes.download 有

exports.download = function(req,res) {
    console.log("here");
    console.log(req.params.noteid);
    console.log(req.params.fileid);
    res.status(200);
    var filepath = path.normalize(__dirname + '/../../');
    filepath += 'server/uploads/' + req.params.fileid;
    console.log(filepath);
    res.download(filepath,'server.pdf');
};

现在的问题是,如果我打开一些网址,例如-

http://localhost:5000/download/note/9281a9d1-1b51-4e1b-9102-2b422cb2a111/e3ec261b-4722-4a69-ada6-68f88e2ff3db.pdf

它直接在浏览器中下载新文件,但如果我从 $http 打开它,显然它会将加密的二进制数据记录到控制台中,而不是下载它。那么,我该如何实现呢?

而且,即使我用类似的东西创建一个锚标签 -

点击前

然后在我单击它后打开一个没有任何模板的页面(因为我在我的 routeProvider 配置中没有为此路由定义任何模板,这表明该路由通过不会将其转发到服务器的 routeProvider,我觉得)这是我单击附件后看到的内容- 在此处输入图像描述 但是如果我在新选项卡中打开它,请求会转到服务器并且它可以工作

4

1 回答 1

2

无法使用 ajax 保存文件,除非您愿意使用 blob 在客户端重建文件。看这里。

只需使用类似的东西

$location.url('/download/note/' + $scope.note.noteId + '/' + $scope.note.storedFileName[n]);

至于第二部分,当路径无效时,您的 routeProvider 不知道该怎么办。添加

$routeProvider
    .when('/', {
        templateUrl: '/partials/main/main',
        controller: 'mainCtrl'
    })
    .when('/browse/notes', {
        templateUrl: '/partials/notes/browseNotes',
        controller: 'browseNotesCtrl'
    })
    .when('/upload/notes', {
        templateUrl: '/partials/notes/uploadNotes',
        controller: 'uploadNotesCtrl'
    })
    .when('/profile', {
        templateUrl: '/partials/account/mvProfile',
        controller: 'mvProfileCtrl'
    })
    .when('/browse/notes/:noteId', {
        templateUrl: '/partials/notes/noteDetail',
        controller: 'mvNoteDetailsCtrl'
    })
    .otherwise({
        redirectTo: '/wherever'
    });
于 2014-07-09T11:56:58.457 回答