我有一个网页,其中包含指向某些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
在新窗口中打开吗?
答案 0 :(得分:3)
打开一个新窗口是客户端操作,而Context.Response
是服务器端命令。要打开新窗口,您需要在客户端执行某些操作。
如果您无法更改原始页面源以运行脚本或更改HTML,那么您无法完成所需的操作。您可以在请求中返回一个页面,该页面具有打开新窗口的脚本,但它不会相同。您必须完全重新创建原始页面,除非添加了脚本(如果您可以这样做,我假设您可以更改原始页面),或者您有一个不同的页面可以打开弹出窗口。
唯一的解决方案是更改原始页面以使用target="_blank"
或使用向链接添加onclick处理程序的脚本添加弹出脚本。你说这两个都做不到。
答案 1 :(得分:0)
我知道这已经过时了,但这是我为实现OP而做的事情。
首先,看起来你是在正确的轨道上,但我注意到你拼错了附件而忘了提供“;”直接在“附件”内容 - 处置声明之后。
这是我使用的原始代码,显示了与您描述的相同的行为!
将您的内容处理声明更改为
Response.AddHeader("Content-Disposition", "attachment; filename=" + docName + ".pdf");
附加说明
如果您将Content-Disposition指定为“Inline”,则会输出 当前窗口中的文件内容。
您需要将此处置更改为“附件”并确保 您的扩展名后缀明确设置为.pdf。