我在 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)