2011-11-28 30 views
11

这是下载文件的代码。如何在新选项卡或窗口中打开PDF文件而不是下载它(使用asp.net)?

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(); 

当执行此代码时,它会要求用户打开或保存该文件。代替这个,我需要打开一个新标签或窗口并显示该文件。我怎样才能做到这一点?

注:

文件将没有必要设在网站上的文件夹。它可能位于其他文件夹中。

+4

你可以试试'内容处置:inline',而不是'attachment' - [参见这篇文章(http://dotanything.wordpress.com/2008/05/30/content-disposition-attachment-vs-inline /) –

+0

这篇文章可以帮助你http://aspalliance.com/259_downloading_files__forcing_the_file_download_dialog –

回答

3

这可能有助于

Response.Write("<script>"); 
Response.Write("window.open('../Inventory/pages/printableads.pdf', '_newtab');"); 
Response.Write("</script>"); 
+0

我如何调用下载文件到这个?这是我的问题。 – smilu

+0

@smilu您是否保存该文件或者只是为了阅读而创建它? – Karthik

+0

我应该为阅读创建它,稍后它也可以保存。问题是我不能给该文件的文件或路径的原始名称。所以我必须执行上述步骤才能下载它,然后用另一个名称打开它。 – smilu

14

不必加载流成字节数组,并将其写入到响应流中,你应该看看HttpResponse.TransmitFile

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

如果你想在PDF要在新窗口中打开,您必须在新窗口中打开下载页面,例如:

<a href="viewpdf.aspx" target="_blank">View PDF</a> 
+0

第一步我有兴趣知道更多。第二步在我的程序中不实用。 bcz我无法将原始路径发送给它。使用第一步可以将文件重定向到另一个窗口? – smilu

+3

您无法从服务器端打开一个新窗口。您必须在新窗口中打开下载页面,并在该窗口中使用TransmitFile将文件返回给用户。 – janzi

+0

你的链接是什么样的?为什么你不能添加一个目标?你可以用JavaScript添加,如果由于某种原因,你不能改变的一个标签的来源(例如它为您生成) –

-4

使用此代码。这就像一个冠军。

Process process = new Process(); 
process.StartInfo.UseShellExecute = true; 
process.StartInfo.FileName = outputPdfFile; 
process.Start(); 
+0

这个方法我试过和它的作品真的很好,谢谢:) – JohnnyBizzle

+9

你的C#代码在服务器上运行。 因此,Process.Start会在服务器上启动进程,而不是您的计算机。 这是根本不可能为你在客户端上直接启动一个进程。 – dnxit

+3

是的,这个答案是完全错误的。 –

1

您必须创建另一个页面或通用处理程序与代码来生成您的pdf。然后,该事件被触发,并且该人被重定向到该页面。

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

而且

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

在javascript:

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

小心重置目标,否则所有其他呼叫像Response.Redirect将在新标签中打开,这可能是不你想要什么。

0

您可以从您的MVC操作返回FileResult。

********************* MVC行动************

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

*** *********** JS **************

使用formpost你的数据发布到行动

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; 

您需要创建一个表单来发布你的数据,追加你的数据,发布你的数据并删除你的文档主体。

但是,表单发布不会将数据发布到新标签只有在EDGE浏览器。但GET请求工作,它只是打开新的标签页包含查询字符串为您的操作参数的URL。

相关问题