PDF принудительная загрузка, а не открытие в браузере

Я использую RazorPDF и хочу принудительно загрузить PDF-файл, а не открывать его на вкладке браузера. Как мне это сделать? Спасибо

public ActionResult Index()
{
    return View();
}

[HttpPost]
public ActionResult Index(string Id)
{
    return RedirectToAction("Pdf");
}

public PdfResult Pdf()
{
    // With no Model and default view name.  Pdf is always the default view name
    return new PdfResult();
}

person dotnet-practitioner    schedule 10.01.2014    source источник
comment
Вам необходимо установить content-disposition в заголовке ответа - stackoverflow.com/questions/1012437/.   -  person adrianbanks    schedule 10.01.2014
comment
Как мне это сделать в приведенном выше коде?   -  person dotnet-practitioner    schedule 10.01.2014
comment
Я не использовал RazorPDF, но вы, вероятно, могли бы сделать это, добавив код из связанного ответа в свое действие, прежде чем вернуть файл PDF.   -  person adrianbanks    schedule 10.01.2014


Ответы (2)


Попробуйте добавить заголовок content-disposition перед возвратом объекта PDFResult.

public PdfResult Pdf()
{
  Response.AddHeader("content-disposition", "attachment; filename=YourSanitazedFileName.pdf");

  // With no Model and default view name.  Pdf is always the default view name
  return new PdfResult();
}
person IronGeek    schedule 10.01.2014
comment
IronGeek, у меня нет файла .pdf для возврата. Поэтому я не уверен, будет ли ваш код работать в моем случае. Спасибо - person dotnet-practitioner; 13.01.2014
comment
@ dotnet-Practitioner Не обязательно, это может быть любое имя. Вы даже можете использовать для этого случайное имя. Браузер будет использовать это имя в качестве имени файла для загрузки в диалоговом окне загрузки файла. - person IronGeek; 13.01.2014

Вы должны посмотреть на заголовок «Content-Disposition»; например, установка «Content-Disposition» на «attachment; filename = FileName.pdf» будет запрашивать у пользователя (обычно) диалоговое окно «Сохранить как: FileName.pdf», а не открывать его. Однако это должно происходить из запроса, выполняющего загрузку, поэтому вы не можете сделать это во время перенаправления. Однако для этой цели ASP.NET предлагает Response.TransmitFile. Например (при условии, что вы не используете MVC, у которого есть другие предпочтительные параметры):

Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=FileName.pdf");
Response.TransmitFile(filePath);
Response.End(); 

Если вы пытаетесь открыть, то файл в Api Convert Stream to BytesArray, а затем заполните содержимое

            HttpResponseMessage result = null;
            result = Request.CreateResponse(HttpStatusCode.OK);
            FileStream stream = File.OpenRead(path);
            byte[] fileBytes = new byte[stream.Length];
            stream.Read(fileBytes, 0, fileBytes.Length);
            stream.Close();           
            result.Content = new ByteArrayContent(fileBytes);
            result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = "FileName.pdf";            
person Skull    schedule 17.12.2015