【问题标题】:Visable download to disc starts after download to browser finishes下载到浏览器完成后,可见下载到光盘开始
【发布时间】:2017-01-13 15:10:01
【问题描述】:

我目前正在尝试从我的 mongo DB 下载文件。 开始下载后,我可以在 chrome 开发工具的网络选项卡中看到文件正在下载。一旦它在这里完成,它就会下载到本地驱动器。我真的不知道怎么跳过这个直接下载到本地驱动。

这对于用户体验来说是非常糟糕的,因为文件非常大而且似乎什么都没有发生。

服务器端:

app.get('/download/single',function(req,res){
        gfs.findOne({ _id: req.query.targetFile}, function(err,file){
            if (err) {
                return res.status(400).send(err);
            }
            else if (!file) {
                return res.status(404).send('Error on the database looking for the file.');
            }
            else{
                res.set('Content-Type', "application/vnd.android.package-archive")
                var readstream = gfs.createReadStream({
                    _id: req.query.targetFile,
                })
                readstream.pipe(res)
                readstream.on('end',function(){
                    res.end()
                })
            }
        })

})

客户端:

app.service('Download',function($http){
    this.single = function(id){
        return $http({
            method: 'GET',
            url: '/download/single',
            params: {
                targetFile: id
            },
            transformResponse: [function (data) {
                return data;
            }]
        }).success(function(response){
            return response
        })
    }

})
app.controller('downloadCtrl',function($scope,$routeParams,$window,Download){
        Download.single($routeParams.id).success(function(data){
            if(data){
                var blob = new Blob([data], {
                    type: "application/vnd.android.package-archive"
                })
                saveAs(blob,'test.apk',true)
            }
        })
    })

【问题讨论】:

    标签: javascript angularjs mongodb file express


    【解决方案1】:

    我的建议是将代码块放在某个函数中,该函数在您选择的事件中调用

    $scope.showLoader = false;
    $scope.onSomeButtonClick = function() {
      $scope.showLoader = true;
      Download.single($routeParams.id).success(function(data){
        $scope.showloader = false;
        if(data){
          var blob = new Blob([data], {
            type: "application/vnd.android.package-archive"
          })
          saveAs(blob,'test.apk',true)
        }
      })
    }
    

    在你的情况下发生了什么,控制器被初始化,并开始执行它的代码。您想要做的只是初始化您希望开始下载的事件侦听器。

    希望这会有所帮助。干杯

    【讨论】:

    • 谢谢老兄!可悲的是它没有解决我的问题。现在我在按下按钮时遇到了同样的问题;)。
    • 我的请求,当您执行 Download.signle 调用时,您希望发生什么? (如果不下载到驱动器)
    • 你想展示某种加载器还是什么?请参考更新后的代码。这个想法是在控制器绑定的视图中显示某种加载器,向用户显示还有一些等待。
    • 我还想告诉你,成功功能已被弃用,如果你想升级你的角度框架,你应该停止使用它。使用 .then() 函数
    • 好吧,很高兴知道。其实我想使用浏览器本身的本机加载器。如果这不可能,我会实现我自己的加载器。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多