使用context.Response强制在新窗口中打开超链接

时间:2013-05-21 09:53:56

标签: c# asp.net

我有一个网页,其中包含指向某些pdf文件的链接,例如http://www.someurl.com/somefolder/filename.pdf

当用户点击这些链接时,身份验证就会启动,用户登录并可以下载文件。我想要实现的是在新窗口中打开下载。

我对代码的访问权限/控制权限有限,无法将target=_blank属性设置为href或添加任何javascript。验证后下载的代码如下:

string filename = Path.GetFileName(context.Request.PhysicalPath);

FileStream MyFileStream;
long FileSize;

string strMapPath = context.Server.MapPath(filename);
MyFileStream = new FileStream(strMapPath, FileMode.Open);
FileSize = MyFileStream.Length;

//Allocate size for our buffer array
byte[] Buffer = new byte[(int)FileSize];
MyFileStream.Read(Buffer, 0, (int)FileSize);
MyFileStream.Close();

//Do buffer cleanup
context.Response.Buffer = true;
context.Response.Clear();

//Add the appropriate headers
context.Response.AddHeader("content-disposition",
"attachement filename=" + filename);

//Add the right contenttype
context.Response.ContentType = "application/pdf";

//Stream it out via a Binary Write
context.Response.BinaryWrite(Buffer);

我们可以强制context.Response在新窗口中打开吗?

2 个答案:

答案 0 :(得分:3)

打开一个新窗口是客户端操作,而Context.Response是服务器端命令。要打开新窗口,您需要在客户端执行某些操作。

如果您无法更改原始页面源以运行脚本或更改HTML,那么您无法完成所需的操作。您可以在请求中返回一个页面,该页面具有打开新窗口的脚本,但它不会相同。您必须完全重新创建原始页面,除非添加了脚本(如果您可以这样做,我假设您可以更改原始页面),或者您有一个不同的页面可以打开弹出窗口。

唯一的解决方案是更改原始页面以使用target="_blank"或使用向链接添加onclick处理程序的脚本添加弹出脚本。你说这两个都做不到。

答案 1 :(得分:0)

我知道这已经过时了,但这是我为实现OP而做的事情。

首先,看起来你是在正确的轨道上,但我注意到你拼错了附件而忘了提供“;”直接在“附件”内容 - 处置声明之后。

这是我使用的原始代码,显示了与您描述的相同的行为!

将您的内容处理声明更改为

Response.AddHeader("Content-Disposition", "attachment; filename=" + docName + ".pdf");

附加说明

  • 如果您将Content-Disposition指定为“Inline”,则会输出 当前窗口中的文件内容。

  • 您需要将此处置更改为“附件”并确保 您的扩展名后缀明确设置为.pdf。