Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: возможно ли header(location) после header(Content-Disposition)?
 
 автор: poli   (26.06.2010 в 13:19)   письмо автору
 
 

здравствуйте, помогите, пожалуйста, с решением след. задачи:
с помощью php вывожу страницу с формой и кнопкой.
после заполнения формы пользователь нажимает кнопку, чтобы сохранить данные из формы в файл к себе на диск. я решаю это с помощью Content-Disposition
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename='1.xls');
require("forma.php"); //документ, который заполняется данными из формы и предлагается для сохранения.
таким образом, когда пользователь нажимает на кнопку броузер отображает диалоговое окно "Загрузка файла", нажмет пользователь "сохранить" или "отмена" - это его дело.
моя проблема - как сделать, чтобы после закрытия окна диалога загрузки файла, произошло обновление данных в окне броузера, например, перенаправление на др. страницу или просто перегрузка этой страницы?
(в любом сл. мне важен не способ решения, а реализация поставл. задачи - нажал на кнопку, выскачило окно "сохранить данные", после сохраниения автоматом обновление страницы)

  Ответить  
 
 автор: Trianon   (26.06.2010 в 13:34)   письмо автору
 
   для: poli   (26.06.2010 в 13:19)
 

>после заполнения формы пользователь нажимает кнопку, чтобы сохранить данные из формы в файл к себе на диск.

К себе на диск?
Это как?
Это сюрр какой-то...
Интернет-приложения с дисками пользователя не работают.


Способ решения чем-то отличается от реализации поставленной задачи?

  Ответить  
 
 автор: poli   (26.06.2010 в 13:58)   письмо автору
 
   для: Trianon   (26.06.2010 в 13:34)
 

если я что-то нечетко описываю, то, пожалуйста, уточните, я попробую объяснить, поскольку мне важно решить задачу.
а сюрр - это простите, когда Вы в браузере выбираете "Файл->Сохранить как..." и он сохраняет файл не на Ваш диск, а на диск сервера, на котором расположен веб-сайт, страничку с которого Вы сохраняете.
Content-disposition как раз и позволяет вызвать такое диалоговое окно - окно браузера, которое и сохранит файл на диск пользователя, а куда же еще...

  Ответить  
 
 автор: Trianon   (26.06.2010 в 14:33)   письмо автору
 
   для: poli   (26.06.2010 в 13:58)
 

Content-Disposition: attachment; filename="файл" 

вкупе с
Content-Type: application/octet-stream; name="файл" 

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

Выдавать эти поля следует в отклике сохраняемого потока. То есть уже после редиректа (через который через Location или еще как)

Только при чем тут окно браузера.
По сути в рассматриваемом потоке и окна-то уже/еще никакого нет.

  Ответить  
 
 автор: poli   (26.06.2010 в 15:14)   письмо автору
 
   для: Trianon   (26.06.2010 в 14:33)
 

вот! меня интересует этот момент:

>Выдавать эти поля следует в отклике сохраняемого потока. То есть уже после редиректа (через который через Location или еще как)
>

можно здесь поподробнее? я не знаю как сделать редирект после приведенного кода, т.е.
после
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename='1.xls');
include("forma.php");

просто написать header('Location: index.php');
понятное дело, работать не будет.
я так понимаю, что решение моей проблемы связано с более глубоким пониманием спецификации протокола HTTP, я его пока очень плохо знаю, потому и ищу помощь на форуме

  Ответить  
 
 автор: Trianon   (26.06.2010 в 16:34)   письмо автору
 
   для: poli   (26.06.2010 в 15:14)
 

>вот! меня интересует этот момент:
>
>>Выдавать эти поля следует в отклике сохраняемого потока. То есть уже после редиректа (через который через Location или еще как)
>>
>
>можно здесь поподробнее? я не знаю как сделать редирект после приведенного кода, т.е.
>после header('Content-Type: application/vnd.ms-excel');


вот видите?
Я говорю, Content-type должен быть после редиректа.
Вы спрашиваете как редирект сделать после content-type

Ну и о каком понимании протокола тут можно говорить, если Вы даже после и перед путать умудряетесь?

>я так понимаю, что решение моей проблемы связано с более глубоким пониманием спецификации протокола HTTP, я его пока очень плохо знаю, потому и ищу помощь на форуме

протокол описан в RFC-2616, ссылки на перевод я приводил здесь неоднократно.
Поиском вытягивается моментально.

  Ответить  
 
 автор: poli   (26.06.2010 в 15:24)   письмо автору
 
   для: Trianon   (26.06.2010 в 14:33)
 

а окно браузера тут не при чем, разве что Вы сами пишите
... провоцируют браузер предложить пользователю сохранить тело отклика в файл на его диске
у меня при этом открывается окошко "сохранить как".

т.е. получается по одному нажатию кнопочки должно быть как бы два ответа от сервера браузеру,
1-й, который провоцируют браузер предложить пользователю сохранить тело отклика в файл на его диске
и 2-й, который делает редирект
если я правильно понимаю проблему, возможно ли это?

  Ответить  
 
 автор: sim5   (26.06.2010 в 13:38)   письмо автору
 
   для: poli   (26.06.2010 в 13:19)
 

Диалоговое окно загрузки файла, это окно приложения (браузера), и решение пользователя в этом диалоге вам не доступно.

  Ответить  
 
 автор: poli   (26.06.2010 в 13:52)   письмо автору
 
   для: sim5   (26.06.2010 в 13:38)
 

правильно, мне и не нужно в этом диалоге ничего,
просто я показываю как я решаю задачу и где начинается проблема, так вот с сохранением файла на диск все ок, окошко браузера выскакивает, данные сохраняются и ВСЕ, в смысле на экране не поисходит обновления информации, а мне нужно чтобы после закрытия диалога "сохранить файл", открылась, например, страничка "ура, страничка2".

  Ответить  
 
 автор: sim5   (26.06.2010 в 13:56)   письмо автору
 
   для: poli   (26.06.2010 в 13:52)
 

Слов просто нет ни каких!
Если вы не имеете доступа к диалогу, это значит вам не возвращается никакого сообщения от системы, что диалог закрыт (заверешен)! И каким образом вы узнаете об этом моменте, чтобы обновить страницу?

  Ответить  
 
 автор: poli   (26.06.2010 в 14:03)   письмо автору
 
   для: sim5   (26.06.2010 в 13:56)
 

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

  Ответить  
 
 автор: sim5   (26.06.2010 в 14:10)   письмо автору
 
   для: poli   (26.06.2010 в 14:03)
 

Вот что милейший, почитайте, что означет ProcessMessages в WinAPI, чтобы не пороть ерунды.
Этот диалог НЕ является объектом документа, а значит вы не получаете от него никаких событий, и момент закрытия этого диалога вам никогда не будет известен! Что это означет?
Есть flash технология, не знаю, возможно она и позволит что-то сделать. Но вы, отдавая пользователю страницу, вторгаетесь на чужую территорию, и не думайте, что на ней вам все доступно.

  Ответить  
 
 автор: poli   (26.06.2010 в 14:23)   письмо автору
 
   для: sim5   (26.06.2010 в 14:10)
 

простите, милейший, но если Вы не знаете, как решить сформ. пробл., это не означает еще, что решить ее в принципе не возможно... а если Вам лень вникунуть в суть проблемы, то, простите не нужно советов, особенно типа "что-то есть, но я не знаю, возможно, что-то можно"
а событийная модель windows меня в данном сл. не интересует, я не по ней строю логику и повторюсь, не жду никакого ответа от диалого браузера

  Ответить  
 
 автор: sim5   (26.06.2010 в 14:30)   письмо автору
 
   для: poli   (26.06.2010 в 14:23)
 

броузер отображает диалоговое окно "Загрузка файла", нажмет пользователь "сохранить" или "отмена" - это его дело.
моя проблема - как сделать, чтобы после закрытия окна диалога загрузки файла, произошло обновление данных в окне броузера
- это ваши слова?

Так вот, повторяю еще раз - нельзя этого сделать потому, что ВАМ НИКОГДА НЕ БУДЕТ ИЗВЕСТЕН МОМЕНТ ЗАКРЫТИЯ ЭТОГО ДИАЛОГА!

Более крупным шрифтом написать?

>а событийная модель windows меня в данном сл. не интересует, я не по ней строю логику

А зря, что вы понятия не имеете об этом (как впрочем и о событиях DOM-объктов на странице). Именно эта модель позволяет узнавать такие моменты, а вам в документе доступны только события от объектов документа! Только от них! А вышеописанный диалог, повторяю еще раз - НЕ ЯВЛЯЕТСЯ ИМ!!! (Событий доступных от окна не так и много, и нужного вам среди них нет)

Делайте вывод сами - можно или нельзя.

  Ответить  
 
 автор: Valick   (26.06.2010 в 15:25)   письмо автору
 
   для: poli   (26.06.2010 в 14:23)
 

кстати, а после закрытия окна сохранения фокус возвращается окну родителю?
может повесить перенаправление на onfocus или как его там? слабо разбираюсь в JS

  Ответить  
 
 автор: sim5   (26.06.2010 в 15:35)   письмо автору
 
   для: Valick   (26.06.2010 в 15:25)
 

Для этого надо перхватывать события, ибо такое событие у окна может возникать часто, и не обязательно по закрытию диалога, то есть должна быть четкая последовательность, начиная от потери фокуса окном. Узнать, что потеря фокуса наступила по клику по кнопке не сложно, а вот дальше начинаются трудности - пользователь может просто щелкнуть по окну вновь, либо отвлечься на дугое окно, и вся последовательность развалится. Вам не известно уже - открыт ли, закрыт ли диалог.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования