首页 > 解决方案 > PDF 下载显示为从 Chrome 中的服务器返回的字节码

问题描述

我有一些 Angular 代码可以调用 API 来为用户检索 PDF。发出请求后,前端或网络都不会抛出任何错误。网络以 PDF 响应,除了它全部是字节码。

这曾经在 Chrome 中有效,据我所知,代码在很长一段时间内都没有改变,所以我不确定发生了什么。更奇怪的是,它在本地对我来说很好,但在我的服务器上,我只是在响应中得到长字节码字符串。有任何想法吗?由于它在本地正常工作,我很难进行故障排除,但我想看看其他人是否遇到过这个问题(也许是最近?)

服务:

  getPDF(): Observable<HttpResponse<Blob>> {
    let url = `${environment}/v9/Folder/${this.folderId}/view`;
    return this.http.get(url, { observe: 'response', responseType: 'blob' });
  }

零件:

  viewFolderCertificate = () => {
    this.viewService.getPDF()
      .subscribe(response => {
        saveAs(response.body, 'view.pdf');
      });
  }

这适用于 IE11、Edge 和 Firefox。我环顾四周,看看是否有任何可能导致此问题的 Chrome 更新 - 还没有运气。我没有运行任何类型的 Adblocker,其他人在我的服务器上遇到过这个问题,所以我认为这与我自己的机器无关。

看起来好像为后端 .net 代码中的 PDF 正确设置了标题:

        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
        response.Content.Headers.ContentLength = stream.Length;
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("inline")

标签: javascriptangular

解决方案


您可能没有在响应中设置内容类型标头。请查看PDF 文件的正确 MIME 媒体类型并设置标题。

如果这不起作用,请检查您是否有以下标题:(X-ContentType-Options: nosniff因此浏览器不会尝试猜测内容类型)和Content-Disposition: attachment; filename="your.pdf"(因此内容始终作为具有指定名称的文件下载)。


推荐阅读