我需要动态显示pdf。但我收到错误:无法加载PDF文档。(我使用Chrome)
Index.cshtml:
<div >
<h3> AJAX: (data='@@Url.Action("GetPDF")')</h3>
<object data='@Url.Action("GetPDF")' type="application/pdf" width="300" height="200"></object>
</div>
<div>
<h3> PATH: (data="/Pdf/32_1.pdf")</h3>
<object data="/Pdf/32_1.pdf" type="application/pdf" width="300" height="200"></object>
</div>
HomeController.cs:
public FileStreamResult GetPDF()
{
string fileName = "32_1.pdf";
FileStream fs = new FileStream(@"C:\Documents\MUH0000020\" + fileName, FileMode.Open, FileAccess.Read);
return File(fs, "application/pdf", fileName);
}
结果:
请帮忙。
答案 0 :(得分:3)
当您使用FileStreamResult()或File()返回文件并指定文件名时,MVC会呈现如下所示的Content-Disposition标头:
附件;文件名= SomeFile.pdf的
&#39;附件&#39;部分是专门告诉浏览器不在浏览器中显示此文档,而是将其作为文件发送。看起来Chrome的PDF查看器在这种情况下会窒息,可能是设计出来了!
这似乎是一种更好的方法来指定文件名,当尝试在Chrome浏览器中显示PDF时显示:
Response.AddHeader("Content-Disposition", "inline; filename=someFile.pdf");
return new FileStreamResult(stream, "application/pdf");
作为旁注,上面的解决方案实际上是有效的,因为您根本没有指定文件名,这会解决标题问题!它可以工作,但不是因为StreamReader实际上是用于处理文本文件。您可以直接传入MemoryStream或FileStream并且没问题。
更多:Content-Disposition:What are the differences between "inline" and "attachment"?
答案 1 :(得分:1)
我改变了方法:
public FileStreamResult GetPDF()
{
string fileName = "32_1.pdf";
StreamReader reader = new StreamReader(@"C:\Documents\MUH0000020\" + fileName);
return new FileStreamResult(reader.BaseStream, "application/pdf");
}