I want to make the browser download a PDF document from server instead of opening the file in browser itself. I am using C#.
Below is my sample code which I used. It not working..
string filename = "Sample server url"; response.redirect(filename);
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You should look at the “Content-Disposition” header; for example setting “Content-Disposition” to “attachment; filename=foo.pdf” will prompt the user (typically) with a “Save as: foo.pdf” dialog, rather than opening it. This, however, needs to come from the request that is doing the download, so you can’t do this during a redirect. However, ASP.NET offers Response.TransmitFile
for this purpose. For example (assuming you aren’t using MVC, which has other preferred options):
Response.Clear(); Response.ContentType = "application/pdf"; Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf"); Response.TransmitFile(filePath); Response.End();
Method 2
If you want to render the file(s) so that you could save them at your end instead of opening in the browser, you may try the following code snippet:
//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();
However, if you want to download the file using a client application then you’ll have to use the WebClient class.
Method 3
I use this by setting inline parameter to true it will show in browser false it will show save as dialog in browser.
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(); }
Method 4
In case if we are trying to write a bytes array then we can use below one.
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();
Method 5
They are almost same in most of the cases but there is a difference:
Add Header will replace the previous entry with the same key
Append header will not replace the key, rather will add another one.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0