我猜我的后端是有效的,因为这样可行并且拉链很好:
curl -X POST -H 'Content-Type: application/json' -d '{}' http://localhost:3000/zip/create > file.zip
我的Django后端返回如下数据:
return HttpResponse(data, content_type='application/octet-stream')
我无法弄清楚我的Angular 2代码中出了什么问题,因为它最终会以某种方式损坏ZIP而我无法打开它。
实际数据似乎在response._body
:
let blob = new Blob([response._body], { "type": 'application/octet-stream;' });
this.exportUrl = this.sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(blob));
this.exportFileName = "download.zip";
点击该网址后,会下载该邮件,但不起作用。显然我不正确地处理二进制数据?
我的服务基本上是这样的:
return this.http.post(
this.zipUrl,
JSON.stringify(zipCreationParameters),
{headers: {'Content-Type': 'application/json'} });
答案 0 :(得分:2)
我通过修改我的服务来实现这一点:
return this.http.post(
this.createUrl,
JSON.stringify(data),
{headers: this.headers, responseType: ResponseContentType.Blob});
添加ResponseContentType.Blob
使内容显示为blob并且有效!
答案 1 :(得分:-1)
嗯,你需要考虑的非常重要的事情是: 在后端将您的UTF-8内容编码为Base64,然后将其发送为produce =" application / zip"。作为前端atob函数支持base64但不支持utf
因为你在uI response._body中收到的是bytestring。现在解码它 as decode(atob(此处的内容))。然后取每个字节字符并将其放入Uint8Array中。而已。经过一天的研究,它对我有用。
function convertDataURIToBinary(dataURI) {
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for(i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}