2011-12-21 155 views
18

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

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

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

为什么不呢?怎么了?什么是实际的网址? – SLaks 2011-12-21 13:27:31

+0

@SLaks ..谢谢你的回复。它正在浏览器的另一个标签中打开。不下载。 – Arun 2011-12-21 13:29:34

回答

29

你应该看看“Content-Disposition”标题;例如,将“Content-Disposition”设置为“attachment; filename = foo.pdf”将提示用户(通常)使用“Save as:foo.pdf”对话框,而不是将其打开。但是,这需要来自请求执行下载,所以在重定向期间您不能这样做。但是,ASP.NET为此提供了Response.TransmitFile。例如(假设你不使用MVC,它有其他可取的方案):如果你要渲染的文件(S),这样你可以在你的结束,而不是在浏览器中打开保存

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

感谢您的回复...如果我给你一个网址而不是foo.pdf你的答案它会工作...? – Arun 2011-12-21 13:32:25

+0

@ Neon no;如果这样做,你实际上需要传输内容; 'TransmitFile'采用* local *文件路径,IIRC。 – 2011-12-21 13:33:34

+0

@ Neon澄清 - 如果URL在别的地方,你可以作为*代理*到那个URL;但是你不能说“去那里获取文件,并把它当作下载” - 提供最终内容的服务器可以选择内容类型和处置。 – 2011-12-21 13:35:46

4

,你可以试试下面的代码片段:

但是,如果你想使用一个客户端应用程序,那么你就必须使用WebClient class下载的文件。

+0

感谢您的回复...我会尝试您的代码并告诉我的反馈.. – Arun 2011-12-21 13:44:06

+0

我在执行Response.BinaryWrite(outStream.ToArray())时收到“参数超出范围异常”。 – Arun 2011-12-21 13:49:43

+0

您是否填写了outStream中的内容?将你的文件读入内存流,我希望它能正常工作。 – 2011-12-21 13:51:55

0

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

添加标题将取代使用相同的密钥

追加头中的一个条目不会取代钥匙,而将再增加一。

2

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