如何从 angular2 RC5 中的 API 下载 PDF?

Posted

技术标签:

【中文标题】如何从 angular2 RC5 中的 API 下载 PDF?【英文标题】:How do you download a PDF from an API in angular2 RC5? 【发布时间】:2016-08-20 00:13:18 【问题描述】:

上一个问题有一些很好的解决方法:

Angular 2 download PDF from API and Display it in View

但是现在 RC5 出来了,我们可以使用 arrayBuffer()。我似乎对此无能为力。我如何从这个变成一个漂亮的 pdf blob:

return this._authHttp.get(this.fileUrl+id)
        .map((res:Response) => res.arrayBuffer())
        .subscribe(
            data => 
                console.log(data);
                var blob = new Blob([data], type: 'application/pdf');
                console.log(blob);
                saveAs(blob, "testData.pdf");

        ,
            err => console.error(err),
        () => console.log('done')
    );

数据最终是我预期的两倍。有什么我想念的想法吗?

【问题讨论】:

【参考方案1】:

我在下载 pdf 文件时遇到了同样的问题。我浪费了两天时间来解决这个问题,但最终还是成功了。你需要将 responseType 设置为 blob。

return this._authHttp.get(this.fileUrl+id , 
                          responseType: ResponseContentType.Blob )
    .map((res:Response) => res.blob())
    .subscribe(
        data => 
            console.log(data);
            var blob = new Blob([data], type: 'application/pdf');
            console.log(blob);
            saveAs(blob, "testData.pdf");

    ,
        err => console.error(err),
    () => console.log('done')
);

别忘了导入 ResponseContentType

希望对你有帮助

【讨论】:

太棒了!! responseType 做到了。我用 let blob = new Blob([response['_body']], type: 'application/pdf' ); 嗨,Kira,我正在尝试上面的解决方案,但我遇到了 saveAs 的问题。我收到错误 TS2304:找不到名称“saveAs” @mayowaogundele 你需要包含github.com/eligrey/FileSaver.js 在这样做之后,我得到了一些错误。为此目的查看新的 SO 帖子 ***.com/questions/40782331/… @mayowaogundele 你需要安装文件保护程序 npm 包【参考方案2】:

谢谢大佬……

这个黑客,改变了我的生活......谢谢。但我做了一个轻微的改变。

        this._authHttp.get(URLx,  responseType: ResponseContentType.Blob )
        .map((res:any) => return res) <-- this line change --!>
        .subscribe( 
            data => 
                var mediaType = 'application/pdf';
                var blob = new Blob([data], type: mediaType);
                var filename = `Veiculo-Eixos-$veiculoDTO.placa.pdf`;
                // saveAs(blob, filename);
                var fileURL = URL.createObjectURL(blob);
                window.open(fileURL); // if you want to open it in new tab  
            ,
            error =>
                console.log(error);
            );

【讨论】:

以上是关于如何从 angular2 RC5 中的 API 下载 PDF?的主要内容,如果未能解决你的问题,请参考以下文章

styleUrls 未在 angular2 ChildComponent (RC5) 中加载

Angular2 RC5:无法绑定到“属性 X”,因为它不是“子组件”的已知属性

Angular2 RC5:无法绑定到“属性 X”,因为它不是“子组件”的已知属性

Angular2 RC5 ngModule:没有 NameService 的提供者

Angular 2路由到同一组件

在 IE10 中升级到 Angular2 RC5 后没有提供 PlatformRef 错误