20

This is the code for downloading the file.

System.IO.FileStream fs = new System.IO.FileStream(Path+"\\"+fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] ar = new byte[(int)fs.Length];
fs.Read(ar, 0, (int)fs.Length);
fs.Close();

Response.AddHeader("content-disposition", "attachment;filename=" + AccNo+".pdf");
Response.ContentType = "application/octectstream";
Response.BinaryWrite(ar);
Response.End();

When this code is executed, it will ask user to open or save the file. Instead of this I need to open a new tab or window and display the file. How can I achieve this?

NOTE:

File won't necessary be located in the website folder. It might be located in an other folder.

Bobrovsky
  • 13,789
  • 19
  • 80
  • 130
smilu
  • 859
  • 7
  • 30
  • 53
  • 7
    You could try `content-disposition: inline` instead of `attachment` - [See this article](http://dotanything.wordpress.com/2008/05/30/content-disposition-attachment-vs-inline/) – Didier Ghys Nov 28 '11 at 10:00
  • this article might help you http://aspalliance.com/259_downloading_files__forcing_the_file_download_dialog – huMpty duMpty Nov 28 '11 at 10:01

7 Answers7

27
Response.ContentType = contentType;
HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=" + fileName);
Response.BinaryWrite(fileContent);

And

<asp:LinkButton OnClientClick="openInNewTab();" OnClick="CodeBehindMethod".../>

In javaScript:

<script type="text/javascript">
    function openInNewTab() {
        window.document.forms[0].target = '_blank'; 
        setTimeout(function () { window.document.forms[0].target = ''; }, 0);
    }
</script>

Take care to reset target, otherwise all other calls like Response.Redirect will open in a new tab, which might be not what you want.

Nina
  • 1,035
  • 12
  • 17
20

Instead of loading a stream into a byte array and writing it to the response stream, you should have a look at HttpResponse.TransmitFile

Response.ContentType = "Application/pdf";
Response.TransmitFile(pathtofile);

If you want the PDF to open in a new window you would have to open the downloading page in a new window, for example like this:

<a href="viewpdf.aspx" target="_blank">View PDF</a>
janzi
  • 473
  • 2
  • 8
  • The first step im interested to know more. The second step is not practical in my program. bcz i cannot sent the original path to it. Using the first step can i redirect the file to another window? – smilu Nov 28 '11 at 10:49
  • 3
    You can not open a new window from server side. You will have to open the download page in a new window, and in that window use TransmitFile to return the file to the user. – janzi Nov 28 '11 at 11:05
  • what does your link look like? Why can't you add a target to it? You can add it with JavaScript if for some reason you can't change the a tag's source (e.g. it's generated for you) – Lou Franco Nov 28 '11 at 16:11
  • You can serverside like this. Hyperlink hyper = new HyperLink();hyper.NavigateUrl="PDFViewer.aspx"; hyper.Attributes.Add("target","_blank"); – clamchoda May 15 '13 at 17:37
  • 5
    Unfortunately, this only works if you have an actual file stored somewhere. If you have a byte array that has been generated for example, there is no 'path' - rendering Response.TransmitFile useless. At least that's what I'm running into. – Bardicer Jul 22 '14 at 15:02
2

this may help

Response.Write("<script>");
Response.Write("window.open('../Inventory/pages/printableads.pdf', '_newtab');");
Response.Write("</script>");
Karthik
  • 2,391
  • 6
  • 34
  • 65
  • How will i call that downloading file into this?? that's my problem. – smilu Nov 28 '11 at 09:58
  • I should create it for reading and later it can be saved too. The problem is i cannot give the original name of the file or path too with the file. So i must do the above step to download it and then open it with another name. – smilu Nov 28 '11 at 10:03
  • Can you make a temp copy on the server? – Alex Dec 12 '14 at 20:37
1

You have to create either another page or generic handler with the code to generate your pdf. Then that event gets triggered and the person is redirected to that page.

1

Here I am using iTextSharp dll for generating PDF file. I want to open PDF file instead of downloading it. So I am using below code which is working fine for me. Now pdf file is opening in browser ,now dowloading

        Document pdfDoc = new Document(PageSize.A4, 25, 10, 25, 10);
        PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
        pdfDoc.Open();
        Paragraph Text = new Paragraph("Hi , This is Test Content");
        pdfDoc.Add(Text);
        pdfWriter.CloseStream = false;
        pdfDoc.Close();
        Response.Buffer = true;
        Response.ContentType = "application/pdf";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.End();

If you want to download file, add below line, after this Response.ContentType = "application/pdf";

Response.AddHeader("content-disposition", "attachment;filename=Example.pdf");   
0

you can return a FileResult from your MVC action.

*********************MVC action************

    public FileResult OpenPDF(parameters)
    {
       //code to fetch your pdf byte array
       return File(pdfBytes, "application/pdf");
    }

**************js**************

Use formpost to post your data to action

    var inputTag = '<input name="paramName" type="text" value="' + payloadString + '">';
    var form = document.createElement("form");
    jQuery(form).attr("id", "pdf-form").attr("name", "pdf-form").attr("class", "pdf-form").attr("target", "_blank");
    jQuery(form).attr("action", "/Controller/OpenPDF").attr("method", "post").attr("enctype", "multipart/form-data");
    jQuery(form).append(inputTag);
    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);
    return false;

You need to create a form to post your data, append it your dom, post your data and remove the form your document body.

However, form post wouldn't post data to new tab only on EDGE browser. But a get request works as it's just opening new tab with a url containing query string for your action parameters.

Harish Mashetty
  • 433
  • 3
  • 13
-5

Use this code. This works like a champ.

Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = outputPdfFile;
process.Start();
Polo Guy
  • 47
  • 1