编辑2
似乎在Dom中移动对象标签是导致问题的原因。我直接在页面上添加了一个iframe,它没有任何问题。
但是,当我将iFrame移动到模式对话框(http://www.ericmmartin.com/projects/simplemodal/)时,PDF会消失(对象标签不再正确呈现)。
所以它似乎不再是关于我的处理程序的问题,而是更多关于为什么在DOM(生活在iFrame中)中移动“对象”(或嵌入)标记的问题导致它“空白”。 “
此外,当pdf从模态对话框移回其原始位置时,它会正确显示。所以,也许我应该更多地关注模态对话本身。
想法?感谢您的建议。
编辑1
所以我对测试做了一些修改。
我有iframe输出pdf请求的对象标记以及服务器时间。
Response.AddHeader("content-type", "text/html");
WebClient client = new WebClient();
Response.Write("<html><head></head><body><h1>"+ DateTime.Now.ToString() + "</h1><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='application/pdf' /></body></html>");
Response.Flush();
Response.Close();
Response.End();
现在我正确地获得了一个包含当前时间的页面,但该对象仅在我发布aspx页面后第一次显示PDF。所以它似乎是某种缓存问题?除了对象没有加载任何东西(甚至不是以前加载的PDF)。
如果右键单击iframe并刷新页面,则对象加载正常。 (如果我使用embed标签也是如此)。
原始问题
我知道有很多问题......
但他们要么没有回答,要么答案没有用。
环境
背景
我正在流式传输的pdf来自存储库,其中的文件没有任何扩展(这是为了安全起见)。我在数据库中查找文件,并通过以下代码将其传回客户端:
Response.Clear();
WebClient client = new WebClient();
Byte[] buffer = client.DownloadData(sPath);
Response.AddHeader("content-length", buffer.Length.ToString());
Response.AddHeader("content-disposition", "inline;filename=" + fileName);
Response.AddHeader("expires", "0");
Response.AddHeader("Content-Type", "application/pdf"); //this is usually dynamic to support other types (doc, xls, txt, etc.)
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.Close();
Response.End();
当直接在浏览器或iframe(显示为模式弹出窗口)中使用 pdf 异常时,这适用于每种文件类型(doc,txt,xls,html) 文件。通过iframe访问时它们无法可靠地工作,但在浏览器中直接访问时工作正常。
它唯一有效的工作是我在发布提供这些文件的aspx页面后第一次请求文档。所有后续命中都会返回一个空白页面(即使是新选项卡或浏览器窗口)。无论如何, Firefox每次都可靠地显示pdf。
尝试解决方案
我尝试了各种流媒体文件:
Response.TransmitFile(sPath);
Response.WriteFile(sPath);
//As well as some others
我尝试在请求结尾处的参数中添加.pdf
http://www.myurl.aspx?File=test.pdf
我尝试通过添加时间戳
来使URL唯一http://www.myurl.aspx?File=test.pdf&Unique=Friday__September_17__2010_12_02_16_PM
取消尝试
我读过有关IIS压缩导致问题的内容,但它是针对较新版本的IIS。
没有尝试使用embed标签,因为我想尽可能坚持iFrame(现有的基础设施使用它)。
非常感谢任何帮助!!!
感谢。
答案 0 :(得分:1)
我遇到类似的问题,当PDF通过SSL流式传输时(仅IE浏览器,FF没有出现问题)只能通过以下方式解决:
Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = true;
Response.AppendHeader("Content-Disposition", "inline; attachment; filename=Filename.pdf");
Response.ContentType = "application/pdf";
Response.WriteFile(path);
Response.Flush();
Response.End();
答案 1 :(得分:1)
所以我放弃了,决定使用标准的IE弹出窗口。
window.open(URL, 'Window', 'height=' + pageHeight + ',width=' + pageWidth + ',top=0,left=0,resizable');
我必须在一个对象标签中呈现pdf,然后在弹出窗口内的iframe内的所有其他内容才能生效,但它可以工作......
if (sDocType == "pdf")
{
Response.AddHeader("content-type", "text/html");
WebClient client = new WebClient();
Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='" + zGetContentType(HttpContext.Current.Request.QueryString["docType"]) + "'><param name='src' value='" + Request.Url.ToString() + "&embed=true' />alt : <a href='" + Request.Url.ToString() + "&embed=true'>View</a></object></body></html>");
Response.Flush();
Response.Close();
Response.End();
}
else
{
Response.AddHeader("content-type", "text/html");
WebClient client = new WebClient();
Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><iframe frameborder='0' scrolling='no' height='100%' width='100%' src='" + Request.Url.ToString() + "&embed=true' /></body></html>");
Response.Flush();
Response.Close();
Response.End();
}
答案 2 :(得分:0)
我不确定您是否需要设置文件名,特别是如果它没有.pdf扩展名。在过去将PDF格式化为浏览器时,我总是使用此代码:
Response.Clear();
Response.ContentType = "application/pdf";
Response.BinaryWrite(pdfBuffer);
Response.Flush();
否则,客户端计算机上的application/pdf
CLSID的注册表设置可能会出现问题。
答案 3 :(得分:0)
我能够解决类似的问题(模式窗口Internet Explorer中的pdf) 取出iframe。而是将pdf加载到html对象元素中。 请参阅以下链接:
http://intranation.com/test-cases/object-vs-iframe/
总结一下: 设置不起作用:
jQuery floatbox,使用iframe加载html片段,将aspx页面加载到iframe,将pdf加载到aspx页面
现在可以使用的设置:
jQuery floatbox,加载html片段,追加对象元素。 在追加对象元素之前,设置数据 object元素的属性到aspx页面url