无法加载PDF文档(ASP.NET MVC ajax)

时间:2015-07-25 13:49:52

标签: c# ajax asp.net-mvc

我需要动态显示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);
}

结果:

enter image description here

请帮忙。

2 个答案:

答案 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");
        }