强制浏览器下载 PDF 文档而不是打开它

Posted

技术标签:

【中文标题】强制浏览器下载 PDF 文档而不是打开它【英文标题】:Force browser to download PDF document instead of opening it 【发布时间】:2011-12-21 13:26:03 【问题描述】:

我想让浏览器从服务器下载 PDF 文档,而不是在浏览器本身中打开文件。我正在使用 C#。

以下是我使用的示例代码。它不起作用..

string filename = "Sample server url";
response.redirect(filename);

【问题讨论】:

为什么不呢?发生什么了?实际网址是什么? @SLaks.. 感谢您的回复..它正在浏览器的另一个选项卡中打开。没有下载。 【参考方案1】:

您应该查看“Content-Disposition”标头;例如,将“Content-Disposition”设置为“附件;文件名=foo.pdf”将提示用户(通常)使用“另存为:foo.pdf”对话框,而不是打开它。但是,这需要来自正在下载的请求,因此您不能在重定向期间执行此操作。但是,ASP.NET 为此提供了Response.TransmitFile。例如(假设您没有使用 MVC,它还有其他首选选项):

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

【讨论】:

感谢您的回复...如果我在您的回答中给出一个 url 而不是 foo.pdf 会起作用吗...? @Neon no;如果这样做,您实际上需要传输内容; TransmitFile 采用 本地 文件路径,IIRC。 @Neon 澄清一下 - 如果 URL 在其他地方,您可以充当该 URL 的 代理;但你不能说“去从[那边]获取文件,并将其视为下载”——提供最终内容的服务器可以选择内容类型和配置。 使用 MVC 的首选选项是什么?谢谢 @WashingtonGuedes return File(filePath, "application/pdf", "foo.pdf");【参考方案2】:

如果你想渲染文件以便在最后保存而不是在浏览器中打开,你可以试试下面的代码 sn-p:

//create new MemoryStream object and add PDF file’s content to outStream.
MemoryStream outStream = new MemoryStream();

//specify the duration of time before a page cached on a browser expires
Response.Expires = 0;

//specify the property to buffer the output page
Response.Buffer = true;

//erase any buffered html output
Response.ClearContent();

//add a new HTML header and value to the Response sent to the client
Response.AddHeader(“content-disposition”, “inline; filename=” + “output.pdf”);

//specify the HTTP content type for Response as Pdf
Response.ContentType = “application/pdf”;

//write specified information of current HTTP output to Byte array
Response.BinaryWrite(outStream.ToArray());

//close the output stream
outStream.Close();

//end the processing of the current page to ensure that no other HTML content is sent
Response.End();

但是,如果您想使用客户端应用程序下载文件,则必须使用WebClient class。

【讨论】:

我在 Response.BinaryWrite(outStream.ToArray()); 行中执行时收到“参数超出范围异常”; outStream里的内容你填了吗?将您的文件读入内存流,我希望它能正常工作。 请尝试这个 sn-p 将文件转换为 MemoryStream: using (FileStream fileStream = File.OpenRead(filePath)) MemoryStream outStream = new MemoryStream(); outStream.SetLength(fileStream.Length); fileStream.Read(outStream.GetBuffer(), 0, (int)fileStream.Length); 您的“WebClient 类”已关闭!【参考方案3】:

我通过将 inline 参数设置为 true 来使用它,它会在浏览器中显示 false 它会在浏览器中显示另存为对话框。

public void ExportReport(XtraReport report, string fileName, string fileType, bool inline)

    MemoryStream stream = new MemoryStream();

    Response.Clear();

    if (fileType == "xls")
        report.ExportToXls(stream);
    if (fileType == "pdf")
        report.ExportToPdf(stream);
    if (fileType == "rtf")
        report.ExportToRtf(stream);
    if (fileType == "csv")
        report.ExportToCsv(stream);

    Response.ContentType = "application/" + fileType;
    Response.AddHeader("Accept-Header", stream.Length.ToString());
    Response.AddHeader("Content-Disposition", String.Format("0; filename=1.2", (inline ? "Inline" : "Attachment"), fileName, fileType));
    Response.AddHeader("Content-Length", stream.Length.ToString());
    //Response.ContentEncoding = System.Text.Encoding.Default;
    Response.BinaryWrite(stream.ToArray());

    Response.End();

【讨论】:

【参考方案4】:

如果我们试图写一个字节数组,那么我们可以使用下面的一个。

            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AppendHeader("Content-Disposition", "attachment; filename=file.pdf");
            Response.BufferOutput = true;
            Response.AddHeader("Content-Length", docBytes.Length.ToString());
            Response.BinaryWrite(docBytes);
            Response.End();

【讨论】:

【参考方案5】:

在大多数情况下它们几乎相同,但有区别:

Add Header 将用相同的键替换上一个条目

附加标题不会替换键,而是添加另一个。

【讨论】:

以上是关于强制浏览器下载 PDF 文档而不是打开它的主要内容,如果未能解决你的问题,请参考以下文章

在浏览器中打开 PDF 而不是下载它

PHP如何强制下载文件

如何在移动浏览器上使用 PHP 强制下载文件?

Java环境中,word文档转PDF直接打开浏览而非下载

强制本地 html 文件中的超链接打开关联的应用程序而不是下载

如何强制浏览器下载 xml 文件?