强制浏览器下载 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 文档而不是打开它的主要内容,如果未能解决你的问题,请参考以下文章