无法获取angular / Core api将pdf下载到新窗口

时间:2020-06-06 14:26:06

标签: c# angular angular9

我正在尝试打开一个新标签,并以角度9显示从Core 2.2 Web API下载的pdf

  public GeneratePdf(id: string): Observable<Blob> {
    return this.http.get( this.urlPdf + '?id=' + id, { responseType: 'blob' });
  }


 this.dataProvider.GeneratePdf(id).subscribe({
      next: (blob) => {

       const blobpart = new Blob([blob], { type: 'application/pdf' });
       var fileUrl = URL.createObjectURL(blobpart);
       let win: any = this.getWindow();
       win.open(fileUrl);
      },
      error: (err) => this.error.handelHttpError(err),
   });

API

 [HttpGet]
    [Route("PDF")]
    public async Task<HttpResponseMessage> PDF(Guid Id) {
      _logger.LogInformation("Request:" + Request.GetDisplayUrl());
      var endpoint = _appSettings.PdfEndpoint;

      try {
        var param = await _dal.GetPDFParameters(Id, endpoint);

        // Get PDF stream
        HttpResponseMessage response = await client.GetAsync(param.EndpontUrl);

        if(response.IsSuccessStatusCode) {
          using(HttpContent content = response.Content) {
            var memStream = new MemoryStream();
            Stream sourceStream = await content.ReadAsStreamAsync();
            sourceStream.CopyTo(memStream);

            var result = new HttpResponseMessage(HttpStatusCode.OK) {
              Content = new ByteArrayContent(memStream.ToArray())
            };
            result.Content.Headers.ContentDisposition =
                new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") {
                  FileName = Id.ToString() + ".pdf"
                };
            result.Content.Headers.ContentType =
                new MediaTypeHeaderValue("application/octet-stream");

            return result;
          }
        } else {
          var result = new HttpResponseMessage(HttpStatusCode.BadRequest);
          return result;
        }
      } catch(Exception ex) {
        _logger.LogError(ex, "Exception error");
        var result = new HttpResponseMessage(HttpStatusCode.InternalServerError);
        return result;
      }
    }

它不会引发错误,它只是在新选项卡中打开一个json对象,并且当pdf内容超过3k字节时,对象的大小看起来太小了

{“版本”:{“主要”:1,“次要”:1,“构建”:-1,“修订”:-1,“主要修订”:-1,“次要修订”:-1}, “ content”:{“ headers”:[{“ key”:“ Content-Disposition”,“ value”:[“ attachment; filename = bd94ee98-65be-4c4f-a001-abecaf1a0644.pdf”]},{“ key” :“ Content-Type”,“ value”:[“ application / octet-stream”]}]},“ statusCode”:200,“ reasonPhrase”:“ OK”,“ headers”:[],“ requestMessage”:null ,“ isSuccessStatusCode”:true}

更新,Blob上有一个小错误,我没有将Blobpart传递给url.CreateObjecturl现在应用程序加载了新标签,但由于没有内容,因此声明了无效的pdf。我知道pdf字节正在进入api结果的内容,因为我已经检查了它。并将其转换为字符串以确保它是pdf。

感谢您抽出宝贵时间。

0 个答案:

没有答案