显示从C#到Angular2视图

时间:2017-09-12 01:39:44

标签: c# angular pdf itext

我试图显示以前上传到服务器的PDF。 PDF位于App_Data文件夹中。我想使用C#Web API 2获取它并在我的Angular 2前端视图中显示它。

C#代码:

  HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest);
  string filename = "somefilename.pdf";
  byte[] buffer = new byte[0];
  MemoryStream memStream = new MemoryStream();


  if (filename != "") {
    PdfReader reader = new PdfReader(Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath) + "/App_Data/Uploads/PDFs/" + filename);
    PdfStamper stamper = new PdfStamper(reader, memStream);

    response = Request.CreateResponse(HttpStatusCode.OK);
    buffer = memStream.ToArray();
    response.Content = new StreamContent(new MemoryStream(buffer));
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    response.Content.Headers.ContentLength = buffer.Length;
    ContentDispositionHeaderValue contentDisposition = null;
    if (ContentDispositionHeaderValue.TryParse("inline; filename=" + filename, out contentDisposition))
    {
      response.Content.Headers.ContentDisposition = contentDisposition;
    }
  }

  return response;

Angular 2代码:

this.documentsService.getFile()
                .subscribe((response: any) => {
                    let file = new Blob([response], { type: 'application/pdf' });
                    let url = URL.createObjectURL(file);
                    window.open(url);
                });

我认为我的Angular代码是错误的。但是,我的第一个目标是从MVC端获取它。此时文件已下载且文件已损坏或无法正确获取。它总是给我一个15字节大小的PDF文件,所以我知道有什么不对劲。我在我的C#后端使用iTextSharp。

提前致谢!

1 个答案:

答案 0 :(得分:3)

从我的评论(提供答案更容易代码):

if (filename != "") {
    var fs = System.IO.File.OpenRead(filename);
    _myDisposable = fs; // see further down in this answer.
    var response = Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StreamContent(fs);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    return response;
}

return response;

修改:我上面发布的代码适合我。唯一的问题是处理流。可能这样做的最好方法是在控制器类上创建一个私有IDisposable成员,然后添加一个dispose覆盖,如下所示:

private IDisposable _myDisposable;
public override void Dispose(bool disposing)
{
    if (disposing && _myDisposable != null)
        _myDisposable.Dispose();
}

请注意,这假设ASP.NET完成了请求(这似乎是合理的,因为它正在处理您的控制器),这应该是正确的。