1

我在 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()调用一个$http调用 AngularJS 应用程序后端的服务。该$http调用应将响应(来自download节点后端函数的二进制响应)包装在一个 promise 中,该 promise 返回给控制器。

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)
4

0 回答 0