【问题标题】:Angular 4.3: Getting an arraybuffer with new HttpClientAngular 4.3:使用新的 HttpClient 获取数组缓冲区
【发布时间】:2018-04-03 08:37:56
【问题描述】:

我想换成新的HttpClient。到目前为止,我处理以下文件下载:

getXlsx (): Observable<any> {
    return this.http.get('api/xlsx', {
      responseType: ResponseContentType.ArrayBuffer, // set as ArrayBuffer instead of Json
    })
    .map(res => downloadFile(res, 'application/xlsx', 'export.xlsx'))
    .catch(err => handleError(err));
  }

export function downloadFile(data: any, type: string, filename: string): string {
  const blob = new Blob([data._body], { type });
  const url = window.URL.createObjectURL(blob);

  // create hidden dom element (so it works in all browsers)
  const a = document.createElement('a');
  a.setAttribute('style', 'display:none;');
  document.body.appendChild(a);

  // create file, attach to hidden element and open hidden element
  a.href = url;
  a.download = filename;
  a.click();
  return url;
}

将 respondeType 更改为 'arraybuffer' 将导致文件为空。任何想法如何解决它?

【问题讨论】:

  • 您是否也尝试过使用responseType: 'blob' + 删除new Blob()
  • 非常感谢!它正在工作!

标签: angular blob httpclient arraybuffer


【解决方案1】:

上述方法可行并且是一个可以接受的解决方案,但是似乎只是将锚标记添加到 DOM 并在您可以以更清洁的方式进行时假装单击时产生了代码味道。 我们最近在使用 FileSaver(https://www.npmjs.com/package/file-saver) 的 Angular 5 网站下载文档时遇到了类似的问题。

使用npm install file-saver 添加 FileSaver 并进行相关导入,您可以使用以下代码下载文件:

getDocument(document: Document) {
    let headers = new HttpHeaders(); // additional headers in here

    return this._http.get(url, {
        headers: headers,
        responseType: "blob" // this line being the important part from the previous answer (thanks for that BTW Martin) 
    }).map(
        res => {
            var x = res;
            if (res) {
                let filename = documentName;
                saveAs(x, filename);
            }
            return true;
        },
        err => {
            return true;
        }
    );
} 

如果存在,则使用本机saveAs 命令,如果不存在,则实现一些其他逻辑来复制功能。

这可能会在引擎盖下做类似的事情(我真的不知道,因为没有改变外观),但它将它划分为一个易于使用的第三方包,我希望能得到维护(手指交叉)而无需我更新功能以适应不同软件包/浏览器的更新版本。

【讨论】:

【解决方案2】:

所以马丁解决了我的问题:

getXlsx (): Observable<any> {
    return this.http.get('api/xlsx', {
      responseType: 'blob' // <-- changed to blob
    })
    .map(res => downloadFile(res, 'application/xlsx', 'export.xlsx'))
    .catch(err => handleError(err));
  }

export function downloadFile(blob: any, type: string, filename: string): string {
  const url = window.URL.createObjectURL(blob); // <-- work with blob directly

  // create hidden dom element (so it works in all browsers)
  const a = document.createElement('a');
  a.setAttribute('style', 'display:none;');
  document.body.appendChild(a);

  // create file, attach to hidden element and open hidden element
  a.href = url;
  a.download = filename;
  a.click();
  return url;
}

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多