2015-07-25 4 views
2

Мне нужно динамически отображать pdf. Но я получаю сообщение об ошибке: Не удалось загрузить PDF документ (я использую Chrome)Не удалось загрузить документ PDF (ASP.NET MVC ajax)

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

При использовании FileStreamResult() или File(), чтобы вернуть файл, и вы должны указать имя файла, MVC оказывает Content-Disposition заголовок, который выглядит следующим образом:

приложение; filename = someFile.pdf

В разделе «Приложение» указано, что браузер не отображает этот документ в браузере, а скорее отправляет его в виде файла. И похоже, что просмотрщик PDF в Chrome задыхается в этой ситуации, возможно, по дизайну!

Это, кажется, лучший способ, чтобы указать имя файла, при попытке получить PDF для отображения в браузере, в Chrome:

Response.AddHeader("Content-Disposition", "inline; filename=someFile.pdf"); 

return new FileStreamResult(stream, "application/pdf"); 

Как примечание стороны, ваше решение выше на самом деле работает, потому что вы Арен 't указывая имя файла вообще, что касается проблемы с заголовком! Он работает, но не из-за StreamReader, который фактически предназначен для работы с текстовыми файлами. Вы могли бы напрямую пройти через MemoryStream или FileStream и все было в порядке.

Подробнее: Content-Disposition:What are the differences between "inline" and "attachment"?

1

Я изменил мой метод:

public FileStreamResult GetPDF() 
     { 
      string fileName = "32_1.pdf"; 
      StreamReader reader = new StreamReader(@"C:\Documents\MUH0000020\" + fileName); 

      return new FileStreamResult(reader.BaseStream, "application/pdf"); 
     } 
+0

Это помогло мне понять, что происходит на самом деле в этой ситуации. См. Мой ответ для деталей! –

Смежные вопросы