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