Angular 2:在blob失败时下载ZIP

时间:2017-03-14 09:26:48

标签: django angular webclient-download

我猜我的后端是有效的,因为这样可行并且拉链很好:

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'} });

2 个答案:

答案 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;
}