|
|
|
| здравствуйте, помогите, пожалуйста, с решением след. задачи:
с помощью php вывожу страницу с формой и кнопкой.
после заполнения формы пользователь нажимает кнопку, чтобы сохранить данные из формы в файл к себе на диск. я решаю это с помощью Content-Disposition
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename='1.xls');
require("forma.php"); //документ, который заполняется данными из формы и предлагается для сохранения.
таким образом, когда пользователь нажимает на кнопку броузер отображает диалоговое окно "Загрузка файла", нажмет пользователь "сохранить" или "отмена" - это его дело.
моя проблема - как сделать, чтобы после закрытия окна диалога загрузки файла, произошло обновление данных в окне броузера, например, перенаправление на др. страницу или просто перегрузка этой страницы?
(в любом сл. мне важен не способ решения, а реализация поставл. задачи - нажал на кнопку, выскачило окно "сохранить данные", после сохраниения автоматом обновление страницы) | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 13:19)
| | >после заполнения формы пользователь нажимает кнопку, чтобы сохранить данные из формы в файл к себе на диск.
К себе на диск?
Это как?
Это сюрр какой-то...
Интернет-приложения с дисками пользователя не работают.
Способ решения чем-то отличается от реализации поставленной задачи? | |
|
|
|
|
|
|
|
для: Trianon
(26.06.2010 в 13:34)
| | если я что-то нечетко описываю, то, пожалуйста, уточните, я попробую объяснить, поскольку мне важно решить задачу.
а сюрр - это простите, когда Вы в браузере выбираете "Файл->Сохранить как..." и он сохраняет файл не на Ваш диск, а на диск сервера, на котором расположен веб-сайт, страничку с которого Вы сохраняете.
Content-disposition как раз и позволяет вызвать такое диалоговое окно - окно браузера, которое и сохранит файл на диск пользователя, а куда же еще... | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 13:58)
| |
Content-Disposition: attachment; filename="файл"
|
вкупе с
Content-Type: application/octet-stream; name="файл"
|
действительно провоцируют браузер предложить пользователю сохранить тело отклика в файл на его диске
(вместо того чтоб открывать новое окно с содержимым или даже менять содержимое в старом).
Выдавать эти поля следует в отклике сохраняемого потока. То есть уже после редиректа (через который через Location или еще как)
Только при чем тут окно браузера.
По сути в рассматриваемом потоке и окна-то уже/еще никакого нет. | |
|
|
|
|
|
|
|
для: 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, я его пока очень плохо знаю, потому и ищу помощь на форуме | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 15:14)
| | >вот! меня интересует этот момент:
>
>>Выдавать эти поля следует в отклике сохраняемого потока. То есть уже после редиректа (через который через Location или еще как)
>>
>
>можно здесь поподробнее? я не знаю как сделать редирект после приведенного кода, т.е.
>после header('Content-Type: application/vnd.ms-excel');
вот видите?
Я говорю, Content-type должен быть после редиректа.
Вы спрашиваете как редирект сделать после content-type
Ну и о каком понимании протокола тут можно говорить, если Вы даже после и перед путать умудряетесь?
>я так понимаю, что решение моей проблемы связано с более глубоким пониманием спецификации протокола HTTP, я его пока очень плохо знаю, потому и ищу помощь на форуме
протокол описан в RFC-2616, ссылки на перевод я приводил здесь неоднократно.
Поиском вытягивается моментально. | |
|
|
|
|
|
|
|
для: Trianon
(26.06.2010 в 14:33)
| | а окно браузера тут не при чем, разве что Вы сами пишите
... провоцируют браузер предложить пользователю сохранить тело отклика в файл на его диске
у меня при этом открывается окошко "сохранить как".
т.е. получается по одному нажатию кнопочки должно быть как бы два ответа от сервера браузеру,
1-й, который провоцируют браузер предложить пользователю сохранить тело отклика в файл на его диске
и 2-й, который делает редирект
если я правильно понимаю проблему, возможно ли это? | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 13:19)
| | Диалоговое окно загрузки файла, это окно приложения (браузера), и решение пользователя в этом диалоге вам не доступно. | |
|
|
|
|
|
|
|
для: sim5
(26.06.2010 в 13:38)
| | правильно, мне и не нужно в этом диалоге ничего,
просто я показываю как я решаю задачу и где начинается проблема, так вот с сохранением файла на диск все ок, окошко браузера выскакивает, данные сохраняются и ВСЕ, в смысле на экране не поисходит обновления информации, а мне нужно чтобы после закрытия диалога "сохранить файл", открылась, например, страничка "ура, страничка2". | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 13:52)
| | Слов просто нет ни каких!
Если вы не имеете доступа к диалогу, это значит вам не возвращается никакого сообщения от системы, что диалог закрыт (заверешен)! И каким образом вы узнаете об этом моменте, чтобы обновить страницу? | |
|
|
|
|
|
|
|
для: sim5
(26.06.2010 в 13:56)
| | а мне и не надо знать закрыт этот диалог или нет, это проблема пользователя хочет пусть сохраняет данные, нет пусть жмет отмену, мне главное, чтобы такое окно выскакивало (и заметьте оно выскакивает) и после в браузере менялась информация (ну пусть не после, а параллельно, не важно), от действий пользователя в окне сохранения это никак не зависит. | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 14:03)
| | Вот что милейший, почитайте, что означет ProcessMessages в WinAPI, чтобы не пороть ерунды.
Этот диалог НЕ является объектом документа, а значит вы не получаете от него никаких событий, и момент закрытия этого диалога вам никогда не будет известен! Что это означет?
Есть flash технология, не знаю, возможно она и позволит что-то сделать. Но вы, отдавая пользователю страницу, вторгаетесь на чужую территорию, и не думайте, что на ней вам все доступно. | |
|
|
|
|
|
|
|
для: sim5
(26.06.2010 в 14:10)
| | простите, милейший, но если Вы не знаете, как решить сформ. пробл., это не означает еще, что решить ее в принципе не возможно... а если Вам лень вникунуть в суть проблемы, то, простите не нужно советов, особенно типа "что-то есть, но я не знаю, возможно, что-то можно"
а событийная модель windows меня в данном сл. не интересует, я не по ней строю логику и повторюсь, не жду никакого ответа от диалого браузера | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 14:23)
| | броузер отображает диалоговое окно "Загрузка файла", нажмет пользователь "сохранить" или "отмена" - это его дело.
моя проблема - как сделать, чтобы после закрытия окна диалога загрузки файла, произошло обновление данных в окне броузера - это ваши слова?
Так вот, повторяю еще раз - нельзя этого сделать потому, что ВАМ НИКОГДА НЕ БУДЕТ ИЗВЕСТЕН МОМЕНТ ЗАКРЫТИЯ ЭТОГО ДИАЛОГА!
Более крупным шрифтом написать?
>а событийная модель windows меня в данном сл. не интересует, я не по ней строю логику
А зря, что вы понятия не имеете об этом (как впрочем и о событиях DOM-объктов на странице). Именно эта модель позволяет узнавать такие моменты, а вам в документе доступны только события от объектов документа! Только от них! А вышеописанный диалог, повторяю еще раз - НЕ ЯВЛЯЕТСЯ ИМ!!! (Событий доступных от окна не так и много, и нужного вам среди них нет)
Делайте вывод сами - можно или нельзя. | |
|
|
|
|
|
|
|
для: poli
(26.06.2010 в 14:23)
| | кстати, а после закрытия окна сохранения фокус возвращается окну родителю?
может повесить перенаправление на onfocus или как его там? слабо разбираюсь в JS | |
|
|
|
|
|
|
|
для: Valick
(26.06.2010 в 15:25)
| | Для этого надо перхватывать события, ибо такое событие у окна может возникать часто, и не обязательно по закрытию диалога, то есть должна быть четкая последовательность, начиная от потери фокуса окном. Узнать, что потеря фокуса наступила по клику по кнопке не сложно, а вот дальше начинаются трудности - пользователь может просто щелкнуть по окну вновь, либо отвлечься на дугое окно, и вся последовательность развалится. Вам не известно уже - открыт ли, закрыт ли диалог. | |
|
|
|