使用AngularJS下载zip文件

时间:2016-03-06 15:22:37

标签: javascript angularjs downloading requestjs

我在AngularJS应用程序中下载zip文件时遇到问题。该设置是一个AngularJS应用程序,具有使用Hapi的相当轻量级的节点后端。我想要做的是单击Angular中的一个按钮来调用Angular Apps后端,然后后端向zip文件的单独服务发出请求,然后需要将该zip文件返回给AngularJS应用

在后端我有这个(使用requestjs简单的HTTP客户端):

download: (id)->
    deferred = Q.defer()
    file = ''
    fileLength = 0

    #    writer = fs.createWriteStream('server_version.zip')
    #    writer.on 'finish', ->
    #      deferred.resolve(stream.data)
    #      console.log 'done'

    stream = request( {
        url: "#{download_url}"
        encoding: null
        headers:
            'X-Secret-Token': <SECRET_TOKEN>
            'Content-Type': 'application/zip'
    })#.pipe(writer)

    data = []

    stream.on 'data', (chunk)->
        data.push chunk

    stream.on 'end', ->
        result = Buffer.concat(data).toString();
        return deferred.resolve(result)

deferred.promise

应用程序的后端部分似乎有效,因为如果我取消注释管道并将其发送到fs进行写入,则每次都会将文件写入后端文件系统。问题是我不想将数据写入后端,我想将其传递回AngularJS前端。在我的前端,我希望能够做到这样的事情:

$scope.download = ->
    $scope.selectedItem.download().then (response)->
        blob = new Blob([response], { type: 'application/octet-stream' })
        console.log 'blob:', blob
        #url = $window.URL or $window.webkitURL
        #$window.location = url.createObjectURL(blob)
        FileSaver.saveAs(blob, "#{$scope.selectedItem.name}.zip") if blob
        console.log 'File saved'

问题是我的下载总是回来损坏。我想我需要想办法将流传递回前端并在那里解析它,或者等待后端的整个流并将其连接到前端可以使用的东西。我尝试使用.on 'data'事件来执行此操作,但zip文件仍然已损坏。

如何将后端zip(或流)从后端传递到前端?

更新 -

$scope.selectedItem.download()调用对AngularJS应用后端进行$http调用的服务。 $http调用应该在响应中包装响应(来自节点后端中的download函数的二进制响应),该响应将返回给控制器。

api服务电话:

deferred = $q.defer()
$http({
  method: verb
  url: url
  params: params
  data: body
  headers: headers
}).success (result)->
  Logger.debug '---- HTTP REQUEST DONE (SUCCESS) ----'
  Logger.debug 'Result: ', result
  deferred.resolve(result)
.error (err)->
  Logger.error '---- HTTP REQUEST DONE (ERROR) ----'
  Logger.error 'Error:', err
  showLogin() if err?.statusCode is 401
  deferred.reject(err)

0 个答案:

没有答案