从C#到Angular2视图显示PDF文件
我正在尝试显示以前上载到服务器的PDF。PDF位于App_数据文件夹中。我想使用C#WebAPI 2获取它,并在Angular 2前端视图中显示它 C#代码: 角度2代码:从C#到Angular2视图显示PDF文件,c#,angular,pdf,itext,C#,Angular,Pdf,Itext,我正在尝试显示以前上载到服务器的PDF。PDF位于App_数据文件夹中。我想使用C#WebAPI 2获取它,并在Angular 2前端视图中显示它 C#代码: 角度2代码: this.documentsService.getFile() .subscribe((response: any) => { let file = new Blob([response], { type: 'application/pdf' })
this.documentsService.getFile()
.subscribe((response: any) => {
let file = new Blob([response], { type: 'application/pdf' });
let url = URL.createObjectURL(file);
window.open(url);
});
我想我的角度代码错了。但无论如何,我的第一个目标是从MVC方面获得它。现在该文件被下载,并且已损坏或无法正确获取。它总是给我一个15字节大小的PDF文件,所以我知道有问题。我在C#后端使用iTextSharp
提前谢谢 根据我的评论(对于代码来说,提供答案更容易):
编辑:我上面发布的代码适合我。唯一的问题是处理流。最好的方法可能是在控制器类上创建一个私有IDisposable成员,然后添加一个dispose覆盖,类似这样:
private IDisposable _myDisposable;
public override void Dispose(bool disposing)
{
if (disposing && _myDisposable != null)
_myDisposable.Dispose();
}
请注意,这假设ASP.NET完成了请求(这似乎合理,因为它正在处理您的控制器),这应该是正确的。根据我的评论(提供答案对于代码来说更容易):
编辑:我上面发布的代码适合我。唯一的问题是处理流。最好的方法可能是在控制器类上创建一个私有IDisposable成员,然后添加一个dispose覆盖,类似这样:
private IDisposable _myDisposable;
public override void Dispose(bool disposing)
{
if (disposing && _myDisposable != null)
_myDisposable.Dispose();
}
请注意,这假设ASP.NET处理了请求(这似乎是合理的,因为它正在处理您的控制器),这应该是正确的。在返回响应之前,缓冲区的长度是多少?实际上我不知道这是如何工作的,所以我真的不知道。抱歉。为什么不换成使用文件API,只打开PDF文件,然后返回二进制流呢?从那里,看看你是否可以用你的网络浏览器打开它。请确保MIME类型正确-我相信它应该是application/pdf或application/octet@PSGuy您能展示一个示例代码吗?@Jed,请看我的答案。对我有用。我不能和Angular说话,但我知道控制器代码可以工作。在返回响应之前,缓冲区的长度是多少?实际上我不知道它是如何工作的,所以我真的不知道。抱歉。为什么不换成使用文件API,只打开PDF文件,然后返回二进制流呢?从那里,看看你是否可以用你的网络浏览器打开它。请确保MIME类型正确-我相信它应该是application/pdf或application/octet@PSGuy您能展示一个示例代码吗?@Jed,请看我的答案。对我有用。我不能和Angular说话,但我知道控制器代码是有效的。是的,这对我有效。我能处理有棱角的部分。谢谢谢谢你接受:)请留心那个一次性的东西。。当我不拥有对Dispose方法的调用时,我总是有点紧张:我已经更新了这个答案,以展示在资源流打开后如何处理它的处置。希望它能帮助一些人:)为什么不在流上使用
using
语句using(MemoryStream ms=new MemoryStream())
using语句通常是个好主意,但举个例子,我认为它实际上不起作用,因为响应流不一定在控制器操作中立即写入,它稍后将在ASP.NET管道中编写。对于这个特定的示例,这可能不是真的,但是当直接从控制器返回实体框架查询而不调用.ToList()
扩展方法时,这肯定是真的。所以,我的一般建议是获得一次性的,在控制器中设置,最后处理。是的,这对我很有效。我能处理有棱角的部分。谢谢谢谢你接受:)请留心那个一次性的东西。。当我不拥有对Dispose方法的调用时,我总是有点紧张:我已经更新了这个答案,以展示在资源流打开后如何处理它的处置。希望它能帮助一些人:)为什么不在流上使用using
语句using(MemoryStream ms=new MemoryStream())
using语句通常是个好主意,但举个例子,我认为它实际上不起作用,因为响应流不一定在控制器操作中立即写入,它稍后将在ASP.NET管道中编写。对于这个特定的示例,这可能不是真的,但是当直接从控制器返回实体框架查询而不调用.ToList()
扩展方法时,这肯定是真的。因此,我的一般建议是获取一次性产品,将其设置在控制器中,最后进行处理。
private IDisposable _myDisposable;
public override void Dispose(bool disposing)
{
if (disposing && _myDisposable != null)
_myDisposable.Dispose();
}