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

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

下面是我使用的示例代码。 它不工作..

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

你应该看一下“Content-Disposition”标题; 例如,将“Content-Disposition”设置为“attachment; filename = 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(); 

如果要渲染文件以便可以将它们保存在最终而不是在浏览器中打开,则可以尝试以下代码段:

 //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类 。

我通过将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(); } 

它们在大多数情况下几乎相同,但存在差异:

添加标题将使用相同的键替换上一个条目

追加标题不会替换密钥,而是会添加另一个。