我有一个PDF文件,我从Web Api 2应用程序提供给AngularJS客户端。我使用file-saver然后将文件保存在客户端上,如下所示(在TypeScript中):
this.$http.get(`${webUrl}api/pdf?id=${fileDto.id}`)
.then((response: ng.IHttpPromiseCallbackArg<any>) => {
var file = new Blob([response.data], { type: 'application/pdf' });
saveAs(file, 'my.pdf');
});
我这样做的原因是我可以使用持票人令牌来授权访问PDF(这是通过拦截器添加的)。这适用于PDF文件包含非UTF8字符的情况。在后一种情况下,文件仍然会下载,但是当我打开它时,它显示为空白。打开文件我可以看到非UTF8字符被替换为□字符。在JavaScript中,当我在调试器中检查response.data
的字符串值时,我看到这些字符由represented表示。我是否正确地假设,因为文件是用JavaScript中的字符串编写的,无论我做什么,我都无法正确保存来自JavaScript的非UTF8字符的文件?
�
字符是Unicode Replacement Character \uFFFD
,它在尝试解析非法UTF-8时由UTF-8解析器插入。
PDF文件不是UTF-8字符串;它们是二进制文件。
要避免从UTF-8到DOMstring(UTF-16)的转换,请将config设置为responseType: 'blob'
:
var config = {responseType: 'blob'};
this.$http.get(`${webUrl}api/pdf?id=${fileDto.id}`, config)
.then((response: ng.IHttpPromiseCallbackArg<any>) => {
̶v̶a̶r̶ ̶f̶i̶l̶e̶ ̶=̶ ̶n̶e̶w̶ ̶B̶l̶o̶b̶(̶[̶r̶e̶s̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶]̶,̶ ̶{̶ ̶t̶y̶p̶e̶:̶ ̶'̶a̶p̶p̶l̶i̶c̶a̶t̶i̶o̶n̶/̶p̶d̶f̶'̶ ̶}̶)̶;
var file = response.data;
saveAs(file, 'my.pdf');
});
有关更多信息,请参阅