我试图显示以前上传到服务器的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。
提前致谢!
答案 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完成了请求(这似乎是合理的,因为它正在处理您的控制器),这应该是正确的。