我正在尝试使用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
的用法错误,但不知道确切的含义。