【问题标题】:Force a hyperlink to open in a new window using context.Response使用 context.Response 强制超链接在新窗口中打开
【发布时间】:2018-05-02 22:47:23
【问题描述】:

我有一个网页链接到一些 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 在新窗口中打开吗?

【问题讨论】:

  • 为什么不响应.WriteFile?
  • 为什么不能使用 target=_blank。你能解释一下原因吗?我认为,使用 HTTP 处理程序可以解决您的目的。
  • 你能给我一个例子 Response.WriteFile 如何在新窗口中打开链接?谢谢
  • suryakiran - 我正在使用httphandler拦截请求,并在用户登录后将用户重定向到登录页面,执行上面下载文件的代码
  • 你能用这样的把戏吗? Response.Write("<script>window.open('+FilePath+','_blank');</script>"); 通过这种方式,您将根据需要将动态 JS 添加到您在 _blank 目标中打开的页面中,而无需触及基本代码。

标签: c# asp.net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我知道这已经过时了,但这就是我为实现 OP 所做的工作。

    首先,您似乎在正确的轨道上,但我注意到您拼写错误 attachment 并且忘记提供“;”直接在“附件”Content-Disposition 声明之后。

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

    将您的内容处置声明更改为此

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

    补充说明

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2011-02-24
      • 2010-11-05
      • 2010-11-01
      • 1970-01-01
      • 2017-11-25
      相关资源
      最近更新 更多