PDF в модальном iframe отображается пустым в IE - PullRequest
3 голосов
/ 17 сентября 2010

РЕДАКТИРОВАТЬ 2

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

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

Таким образом, кажется, что это неболее длинный вопрос о моем обработчике, но больше вопрос о том, почему перемещение тега «object» (или embed) в 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();

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

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


Оригинальный вопрос

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

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

Среда

  • .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 каждый раз, независимо от того.

Попытки решения

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

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, если это возможно (существующая инфраструктура использует его).

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 20 сентября 2010

Поэтому я сдался и решил вместо этого использовать стандартное всплывающее окно 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();
}
1 голос
/ 17 сентября 2010

У меня была похожая проблема, которая возникла, когда 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();
0 голосов
/ 14 декабря 2011

Мне удалось решить аналогичную проблему (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, добавление элемента объекта.перед добавлением элемента объекта установите атрибут данных элемента объекта в URL страницы aspx

0 голосов
/ 17 сентября 2010

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

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

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

...