无法使用Angular从服务器下载zip文件

时间:2018-10-25 06:11:34

标签: angular flask zip sftp ziparchive

我正在尝试使用Angular从服务器下载zip文件。

烧瓶代码:

return send_file('<path>/filename.zip', attachment_filename='filename.zip', as_attachment=True)

角度代码:

saveFile() {
const headers = new Headers();
headers.append('Accept', 'application/zip');
headers.append('Authorization', 'Token ' + <some token>);
headers.append('Access-Control-Allow-Origin', '*');
this.http.post('http://<server>:<port>/api/<urlpath>', {'somefield': 'somedata'}, { headers: headers, responseType: ResponseContentType.ArrayBuffer})
  .toPromise()
  .then(response => this.saveToFileSystem(response));
}

str2bytes(str: string) {
const bytes = new Uint8Array(str.length);
for (let i= 0; i< str.length; i++) {
  bytes[i] = str.charCodeAt(i);
}
return bytes;
}

private saveToFileSystem(response: any) {
const filename = 'file.zip';
const blob = new Blob([this.str2bytes(response._body)], {type: 'application/zip'});
saveAs(blob, filename);
}

有了这个,我可以下载文件,但是不能解压缩。错误是

  

档案的格式未知或已损坏

我看到Angular 5和Angular 6中的HTTP实现存在差异。如果我错了,请纠正我。如果是,我正在寻找使用Angular 6的解决方案。此外,我还在考虑是否有一种方法可以返回连接(例如SFTP或类似的东西)而不是文件本身,并通过连接流式传输文件,然后关闭连接。任何帮助将不胜感激。

更新1

我发现了我的错误。我必须按原样使用reponse._body而不是将其转换为字节。所以, const blob = new Blob([this.str2bytes(response._body)], {type: 'application/zip'});应该是const blob = new Blob([response._body], { type: 'application/zip' });。这里不使用str2bytes函数。但这仅在Angular 5中有效,而在Angular 6中则无效。我与Angular 6一起面临另一个错误。我向其添加了一个catch,如下所示。

this.http.post('http://<server>:<port>/api/<urlpath>', {'somefield': 'somedata'}, { headers: headers, responseType: ResponseContentType.ArrayBuffer})
.toPromise()
.then(response => this.saveToFileSystem(response))
.catch( error => { 
     console.error(error);
      });

错误是

  

{错误:语法错误:JSON中位置0处的意外令牌P   在JSON.parse()

这个错误对我来说是一个完全的惊喜。无法找出问题出在哪里。任何帮助表示赞赏。

更新2

尝试调试。我看到这是回应:

  

消息:“输入意外结束”

我怀疑HTTP的用法错误,但不知道确切的含义。

0 个答案:

没有答案