2010-09-17 1 views
3

EDIT 2PDF в модальном IFRAME делает заготовки в IE

Оказывается, что перемещение объекта тег в Dom является причиной проблемы. Я добавил iframe прямо на страницу, и он отлично работает без каких-либо проблем.

Однако, когда я перемещаю этот iFrame в модальное диалоговое окно (http://www.ericmmartin.com/projects/simplemodal/), PDF исчезает (тег объекта больше не отображается правильно).

Таким образом, похоже, что это уже не вопрос о моем обработчике, а вопрос о том, почему перемещение тега «объект» (или вставки) в DOM (который живет внутри iFrame) приводит к тому, что он «пуст» «.

Кроме того, когда pdf перемещается из модального диалога обратно в исходное положение, он отображается правильно. Поэтому, возможно, я должен больше сосредоточиться на самом модальном диалоге.

Мысли? Спасибо за ваши предложения.


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

Теперь я получаю страницу с текущим временем правильно, но объект отображается только PDF в первый раз после того, как я публикую страницу ASPX. Так что, похоже, это какая-то проблема кеширования? За исключением того, что объект ничего не загружает (даже не загруженный ранее PDF-файл).

Если щелкнуть правой кнопкой мыши по iframe и обновить страницу, объект загрузится нормально. (То же самое верно, если я использую тег embed).


Оригинал Вопрос

Я знаю, что есть много вопросов по этому ...

Но они либо не получили ответа, либо ответ не сработал.

Environment

  • .Net 4
  • Adobe 9.3.4
  • IIS 5.1
  • XP sp3
  • VS 2010
  • IE 8.0.6001.18702

фон

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

Это работает для всех типов файлов (DOC, TXT, XLS, HTML), когда используется непосредственно в браузере или в iframe (отображается как модальное всплывающее окно) с исключением из pdf. Они не работают надежно при доступе через iframe, но работают нормально при обращении непосредственно в браузере.

Единственный раз, когда он работает, это первый раз, когда я запрашиваю документ после публикации страницы aspx, обслуживающей эти файлы. Все последующие удары возвращают пустую страницу (даже с новых вкладок или окон браузера). Firefox надежно отображает PDF каждый раз независимо.

Покушение Solutions

Я пробовал различные способы ввода потокового файла:

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 

Un-Покушение

Я читал о сжатия IIS, вызывающих проблемы, но это было для новой версии IIS.

Не пытайтесь использовать встроенный тег, поскольку я хотел бы придерживаться iFrame, если это возможно (существующая инфраструктура использует его).

Любая помощь была бы принята с благодарностью!

Спасибо.

ответ

1

Так что я сдался и решил использовать стандартное всплывающее окно IE.

window.open(URL, 'Window', 'height=' + pageHeight + ',width=' + pageWidth + ',top=0,left=0,resizable'); 

я должен был вынести ПРВ в качестве тега объекта и все остальное внутри фрейма внутри всплывающего окна для того, чтобы работать, но это работает ...

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

У меня была аналогичная проблема, которая возникла, когда ПРВ были потоковой передачи через 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(); 
+0

Спасибо, но теперь я получаю то же поведение, за исключением того, что файл загружается и открывается в собственном приложении. Это работает только в первый раз после публикации моего сайта. –

0

Я не убедитесь, что вам нужно указать имя файла, особенно если он не имеет расширения .pdf. При потоковом PDF-файлов в браузере в прошлом, я всегда использовал этот код:

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.BinaryWrite(pdfBuffer); 
Response.Flush(); 

В противном случае, есть вероятность того, что что-то обливали над параметрами реестра для application/pdf CLSID на клиентском компьютере.

+0

Спасибо @AJ, я пробовал это, но получаю тот же результат. Я думаю, что проблема связана скорее с проблемами кеширования (см. Мое редактирование выше). –

0

Я был в состоянии решить аналогичная проблема (pdf внутри модального окна Internet Explorer) , вынимая iframe. Вместо этого загрузите pdf в элемент html-объекта. увидеть ссылку ниже:

http://intranation.com/test-cases/object-vs-iframe/

Подводя итог: Устройство, не работал:

JQuery floatbox, загружает HTML-фрагмента с IFRAME, ASPX страницы нагрузки в IFRAME, загрузки в формате PDF в ASPX страница

Устройство, теперь работает:

JQuery floatbox, загружает HTML-фрагмент, добавить объект элемент. перед добавлением элемента объекта, установить данные атрибут элемента объекта на страницу aspx url