【问题标题】:PDF force download as opposed to open in browserPDF 强制下载而不是在浏览器中打开
【发布时间】:2014-01-29 15:40:54
【问题描述】:

我正在使用 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();
}

【问题讨论】:

  • 您需要在响应头中设置content-disposition - stackoverflow.com/questions/1012437/…
  • 如何在上面的代码中做到这一点?
  • 我没有使用过 RazorPDF,但您可以在返回 PDF 文件之前在您的操作中添加链接答案中的代码。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razorpdf


【解决方案1】:

尝试在返回PDFResult 对象之前添加content-disposition 标头。

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();
}

【讨论】:

  • IronGeek,我没有要返回的 .pdf 文件。所以我不确定你的代码是否适用于我的情况。谢谢
  • @dotnet-practitioner 您不必这样做,它可以是任何名称。您甚至可以为它使用随机名称。浏览器将使用该名称作为下载文件对话框中的文件名。
【解决方案2】:

您应该查看“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 中的文件将 Stream 转换为 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";            

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多